c++_qt_note

c++与QT学习记录

给李工干项目涉及到相关知识,终究躲不过c艹,开个帖子记录学习,方便查询相关

FF

资料来源

C++:http://c.biancheng.net/cplus/

QT:http://c.biancheng.net/qt/ // QT官方教程

快捷键记录

1)帮助文件:F1 (光标在函数名字或类名上,按 F1 即可跳转到对应帮助文档,查看其详细用法)

2).h 文件和对应.cpp 文件切换:F4

3)编译并运行:Ctrl + R

4)函数声明和定义(函数调用和定义)切换:F2

5)代码注释取消注释:Ctrl + / (选中代码再按快捷键)

6)字体变大变小:Ctrl + 鼠标滚轮向上向下

7)移动代码:选中所要移动的代码 -> 按住 ctrl + shift -> 键盘方向键

8)查找替换关键字:Ctrl + F

9)快速打开代码所在目录:编辑模式下 -> 选中项目文件 -> 右击 -> 选择“显示包含的目录”,即可显示项目所在目录(此方法同样可以打开代码文件所在目录)

关于语言相关资料来源https://wizardforcel.gitbooks.io/wudi-qt4/content/19.html

linux常用指令

man 获得联机帮助,是类 Unix 用户的在线帮助手册
cd 切换当前路径命令
pwd 显示当前路径
ls 显示目录下面的文件和子目录情况
chmod 变更文件和目录的属性
mkdir 建立目录
rm 删除目录或文件
su 切换用户登录到 shell,常见从一般用户到 root 用户或者相反顺序
exec 执行程序,并且不返回到当前 shell
ldd 查看应用程序使用的动态库
nm 查看程序或库的调试信息
objdump 查看程序或库的信息
env 查看环境变量
grep 从文件中查找字符串
find 查找文件
which 查找命令的可执行文件
uname 查看操作系统版本
ps 查看进程信息
top 查看系统资源信息
vmstat 查看系统虚拟机各资源信息
vi/vim 使用 vi/vim 编辑器
make 处理工程文件,生成可执行文件或库或其他资源文件
gdb/dbx 调试工具命令
strace/ltrace 跟踪程序调用的系统函数情况
file 查看文件的格式
fuser 查看进程使用了哪些文件

关于各个文件配合关系—距离说明

.h 定义窗体类的头文件,定义了类Widget
.cpp Widget 类的功能实现源程序文件
.ui 窗体界面文件,由UI设计器自动生成,存储了窗体上各个组件的属性设置和布局
ui_widget.h 编译后,根据窗体上的组件及其属性、信号与槽的关联等自动生成的一个类的定义文件,类的名称是Ui_Widget

UI布局

布局组件 功能
Vertical Layout 垂直方向布局,组件自动在垂直方向上分布
Horizontal Layout 水平方向布局,组件自动在水平方向上分布
Grid Layout 网格状布局,网状布局大小改变时,每个网格的大小都改变
Form Layout 窗体布局,与网格状布局类似,但是只有最右侧的一列网格会改变大小
Horizontal Spacer 一个用于水平分隔的空格
Vertical Spacer 一个用于垂直分隔的空格

快捷键查询

按钮及快捷键 功能
Edit Widget (F3) 界面设计进入编辑状态,就是正常的设计状态
Edit Signals/Slots(F4) 进入信号与槽的可视化设计状态
Edit Buddies 进入伙伴关系编辑状态,可以设置一个Label 与一个组件成为伙伴关系
Edit Tab Order 进入Tab 顺序编辑状态,Tab 顺序是在键盘上按Tab 键时,输入焦点在界面各组件之间跳动的顺序
Lay Out Horizontally (Ctrl+H) 将窗体上所选组件水平布局
Lay Out Vertically (Ctrl+L) 将窗体上所选组件垂直布局
Lay Out Horizontally in Splitter 将窗体上所选组件用一个分割条进行水平分割布局
Lay Out Vertically in Splitter 将窗体上所选组件用一个分割条进行垂直分割布局
Lay Out in a Form Layout 将窗体上所选组件按窗体布局
Lay Out in a Grid 将窗体上所选组件网格布局
Break Layout 解除窗体上所选组件的布局,也就是打散现有的布局
Adjust Size(Ctrl+J) 自动调整所选组件的大小

项目功能实现

ui_xxx.h 文件

查看 crtl在头文件查询 资料来源

https://blog.csdn.net/modi000/article/details/107550427

关于使用designer ui编写c++

第二种方法相对比较简单一点,就是将Ui::Dialog ui或Ui::Dialog ui写成一个新定义类的一个数据成员,也就是qtcreator提供的那种方法。(也叫*单继承方法,只继承了QDialog类)

以下来源:https://www.cnblogs.com/rainbow70626/p/6919240.html

1
2
3
4
5
6
7
8
9
10
11
12
13
14
#include <QDialog>
#include "ui_dialog.h"
class Dialog : public QDialog {
Q_OBJECT
public:
Dialog(QWidget *parent = 0);
~Dialog();
protected:
void changeEvent(QEvent *e);
private:
Ui::Dialog *ui;
private slots:
void on_pushButton_clicked();
};

/home/xiaomu/QT/build-Application-Desktop-Debug/ui_qwdialog.h

UI—go to slot

  1. *//定义bool型输出变量*
    
  2. ​ bool enable = false;
  3. //调用文字属性设置变量,传输输入变量enable用于保存是否点击了ok按钮,第二个参数为文字属性对话框默认值
  4. ​ QFont font = QFontDialog::getFont(&enable,QFont(“宋体”,20,QFont::Bold),this,”自定义文字属性”);
  5. //当点击属性对话框的ok按钮后,变量enable的值为true
  6. ​ if(enable)
  7. ​ {
  8. ​ ui->label->setFont(font);
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
//    qApp->setFont(QFont("宋体",20,QFont::Bold));
QFont font;
//设置文字字体
font.setFamily("宋体");
//设置文字大小为50像素
font.setPixelSize(50);
//设置文字为粗体
font.setBold(true); //封装的setWeight函数
//设置文字为斜体
font.setItalic(true); //封装的setStyle函数
//设置文字大小
font.setPointSize(20);
//设置文字倾斜
font.setStyle(QFont::StyleItalic);
//设置文字粗细//enum Weight 存在5个值
font.setWeight(QFont::Light);
//设置文字上划线
font.setOverline(true);
//设置文字下划线
font.setUnderline(true);
//设置文字中划线
font.setStrikeOut(true);

//设置字间距%
font.setLetterSpacing(QFont::PercentageSpacing,300); //300%,100为默认
//设置字间距像素值
font.setLetterSpacing(QFont::AbsoluteSpacing,20); //设置字间距为100像素
//设置首个字母大写(跟参数有关,也可以设置全部大写AllUppercase)
font.setCapitalization(QFont::Capitalize);


//通过QFontMetrics获取字体的值
QFontMetrics fm(font);
qDebug() << fm.height(); //获取文字高度
qDebug() << fm.maxWidth(); //获取文字宽度

//通过QFontInfo获取也能获取字体信息

QFontInfo fInfo(font);
qDebug() << fInfo.family() <<" "<<fInfo.style() << fInfo.pixelSize() << fInfo.overline();


//设可以单独置QPlainTextEdit字体
//ui->plainTextEdit->setFont(font);

//将当前设置的字体设置为默认字体
qApp->setFont(font);

非自动生成的,需要在cpp文件中手动添加链接关系

.h文件中声明函数

.cpp文件中设置功能,若非自动生成,则需要在cpp文件setup处手动添加连接关系,具体查看测试文件qwdialog

关联-QT信号与槽机制详解

信号与槽(Signal & Slot)是 Qt 编程的基础,也是 Qt 的一大创新。因为有了信号与槽的编程机制,在 Qt 中处理界面各个组件的交互操作时变得更加直观和简单。

信号(Signal)就是在特定情况下被发射的事件,例如PushButton 最常见的信号就是鼠标单击时发射的 clicked() 信号,一个 ComboBox 最常见的信号是选择的列表项变化时发射的 CurrentIndexChanged() 信号。

槽(Slot)就是对信号响应的函数。槽就是一个函数,与一般的C++函数是一样的,可以定义在类的任何部分(public、private 或 protected),可以具有任何参数,也可以被直接调用。槽函数与一般的函数不同的是:槽函数可以与一个信号关联,当信号被发射时,关联的槽函数被自动执行。

信号与槽关联是用 QObject::connect() 函数实现的,其基本格式是:

QObject::connect(sender, SIGNAL(signal()), receiver, SLOT(slot()));

connect() 是 QObject 类的一个静态函数,而 QObject 是所有 Qt 类的基类,在实际调用时可以忽略前面的限定符,所以可以直接写为:

connect(sender, SIGNAL(signal()), receiver, SLOT(slot()));

其中,sender 是发射信号的对象的名称,signal() 是信号名称。信号可以看做是特殊的函数,需要带括号,有参数时还需要指明参数。receiver 是接收信号的对象名称,slot() 是槽函数的名称,需要带括号,有参数时还需要指明参数。

SIGNAL 和 SLOT 是 Qt 的宏,用于指明信号和槽,并将它们的参数转换为相应的字符串。例如,在 samp2_1(前面章节中的项目)的 ui_widget.h 文件中,在 setupUi() 函数中有如下的语句:

QObject::connect(btnClose, SIGNAL(clicked()), Widget, SLOT(close()));

其作用就是将 btnClose 按钮的 clicked() 信号与窗体(Widget)的槽函数 close() 相关联,这样,当单击 btnClose 按钮(就是界面上的“Close”按钮)时,就会执行 Widget 的 close() 槽函数。

关于信号与槽的使用,有以下一些规则需要注意:

  • 一个信号可以连接多个槽,例如:

    connect(spinNum, SIGNAL(valueChanged(int)), this, SLOT(addFun(int));
    connect(spinNum, SIGNAL(valueChanged(int)), this, SLOT(updateStatus(int));

    这是当一个对象 spinNum 的数值发生变化时,所在窗体有两个槽进行响应,一个 addFun()用于计算,一个 updateStatus() 用于更新状态。

    当一个信号与多个槽函数关联时,槽函数按照建立连接时的顺序依次执行。

    当信号和槽函数带有参数时,在 connect()函数里,要写明参数的类型,但可以不写参数名称。

  • 多个信号可以连接同一个槽,例如在 samp2_2(前面章节中的项目)中,让三个选择颜色的 RadioButton的clicked() 信号关联到相同的一个自定义槽函数 setTextFontColor()。

    connect(ui->rBtnBlue,SIGNAL(clicked()),this,SLOT(setTextFontColor()));
    connect(ui->rBtnRed,SIGNAL(clicked()),this,SLOT(setTextFontColor()));
    connect(ui->rBtnBlack,SIGNAL(clicked()),this,SLOT(setTextFontColor()));

    这样,当任何一个 RadioButton 被单击时,都会执行 setTextFontColor() 函数。

  • 一个信号可以连接另外一个信号,例如:

    connect(spinNum, SIGNAL(valueChanged(int)), this, SIGNAL (refreshInfo(int));

    这样,当一个信号发射时,也会发射另外一个信号,实现某些特殊的功能。

  • 严格的情况下,信号与槽的参数个数和类型需要一致,至少信号的参数不能少于槽的参数。如果不匹配,会出现编译错误或运行错误。

  • 在使用信号与槽的类中,必须在类的定义中加入宏 Q_OBJECT。

  • 当一个信号被发射时,与其关联的槽函数通常被立即执行,就像正常调用一个函数一样。只有当信号关联的所有槽函数执行完毕后,才会执行发射信号处后面的代码。

信号与槽机制是 Qt GUI 编程的基础,使用信号与槽机制可以比较容易地将信号与响应代码关联起来。

QtDesiger 更改按钮的背景、字体颜色、大小

1、简介

更改QtDesgner 按钮上的背景、字体颜色、字体大小、字体格式

2、更改背景

代码中:

1
2
self.pushButton.setStyleSheet("border-image:url(./image/test.png)")
border-image:url(./image/test.png)

3、更改字体颜色、大小、格式

1
self.pushButton.setStyleSheet("color:rgb(0,0,255)")

font 修改

纯QT代码较复杂,暂时不考虑。

qtcreator 使用快捷键

功能 快捷键 解释
Switch Header/Source F4 在同名的头文件和源程序文件之间切换
Follow Symbol Under Cursor F2 跟踪光标下的符号,若是变量,可跟踪到变量声明的地方;若是函数体或函数声明,可在两者之间切换
Switch Between Function Declaration and Definition Shift+F2 在函数的声明(函数原型)和定义(函数实现)之间切换
Refactor\Rename Symbol Under Cursor Ctrl+Shift+R 对光标处的符号更改名称,这将替换到所有用到这个符号的地方
Refactor\Add Definition in .cpp 为函数原型在 cpp 文件里生成函数体
Auto-indent Selection Ctrl+I 为选择的文字自动进行缩进
Toggle Comment Selection Ctrl+/ 为选择的文字进行注释符号的切换,即可以注释所选代码,或取消注释
Context Help F1 为光标所在的符号显示帮助文件的内容
Save All Ctrl+Shift+S 文件全部保存
Find/Replace Ctrl+F 调出查找/替换对话框
Find Next F3 查找下一个
Build Ctrl+B 编译当前项目
Start Debugging F5 开始调试
Step Over F10 调试状态下单步略过,即执行当前行程序语句
Step Into F11 调试状态下跟踪进入,即如果当前行里有函数,就跟踪进入函数体
Toggle Breakpoint F9 设置或取消当前行的断点设置

项目相关-数据显示

QLabel 用于显示字符串,QLineEdit 用于显示和输入字符串。这两个类都有如下的两个函数用于读取和设置显示文字。

1
2
QString text() const
void setText(const QString &)

column row

action添加图像节点

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
void MainWindow::on_actAddFiles_triggered()
{//添加图片文件节点
QStringList files=QFileDialog::getOpenFileNames(this,"选择一个或多个文件","","Images(*.jpg)");//多选文件
if (files.isEmpty()) //如果一个文件都没选
return;
QTreeWidgetItem *parItem,*item; //节点
item=ui->treeFiles->currentItem(); //当前节点
if (item->type()==itImageItem) //若当前节点是图片节点,取其父节点作为父节点
parItem=item->parent();
else //否则取当前节点为父节点
parItem=item;
for (int i = 0; i < files.size(); ++i)
{
QString aFilename=files.at(i); //得到StringList里的一行,也就是一个文件名
addImageItem(parItem,aFilename); //添加一个图片节点
}
}
void MainWindow::addImageItem(QTreeWidgetItem *parItem, QString aFilename)
{//添加一个图片文件节点
QIcon icon(":/images/icons/31.ico");//ICON的图标
QString NodeText=getFinalFolderName(aFilename); //获得最后的文件名称
QTreeWidgetItem *item; //节点
item=new QTreeWidgetItem(MainWindow::itImageItem); //新建节点时设定类型为 itImageItem
item->setIcon(colItem,icon); //设置图标
item->setText(colItem,NodeText); //最后的文件夹名称
//item->setText(colSecond,"type=itImageItem; data="+aFilename); //完整目录名称
item->setText(colItemType,"type=itImageItem"); //完整目录名称
item->setFlags(Qt::ItemIsSelectable | Qt::ItemIsUserCheckable | Qt::ItemIsEnabled | Qt::ItemIsAutoTristate); //设置节点选项
item->setCheckState(colItem,Qt::Checked); //节点选中
item->setData(colItem,Qt::UserRole,QVariant(aFilename)); //设置节点Qt::UserRole的Data,存储完整文件名称
parItem->addChild(item); //在父节点下面添加子节点
}

QFileSystemModel 提供了一个可用于访问本机文件系统的数据模型。

文本文档读入数据并显示

多UI并列设计

QT MDI 应用四界面方案 —- usel删去

读写文件方式 7_1 采集项目中的图片

  1. 用 QFile 类的 IODevice 读写功能直接进行读写 io设备
  2. 利用 QFile 和 QTextStream 结合起来,用流(Stream)的方法进行文件读写。 读写相关

关于中文乱码

最后读取编码,并且发送一定位数的编码数据

  • QFile 负责文件的 IO 设备接口,即与文件的物理交互;
  • QDataStream 以数据流的方式读取文件内容或写入文件内容。

dat文件读取与写入

以下qt例程 (用qt4写了一遍5-sample)

熟悉显示功能、读取功能、截取视频流方式

1.mainwindow 窗口样式界面简单,省略 label Qlabel

2.application dialog样式 —-学习常用按键以及命名习惯

包含 修改字体、颜色

使用功能键位:(class)QPushButton QCheckBox 方框打勾 QRadioButton 圆圈打勾 QPlainTextEdit

命名习惯(暂时这样):btn(OK、CLOSE、cancel) chkBox(Bold、Under、italic)、rBtn(Black、Blue、Red) txtEdit

3.纯代码编写界面 sample2.3,同2——了解原理、以后再学习

建立一个 Widget Appliation 项目

关键是取消创建窗体,即不勾选“Generate form”(创建界面)复选框,无选项框选

iniUI

声明函数—代码建立功能键位—建立功能映射—connect相关

声明class 自动生成,不要修改,注意变量

4.字符串读取模板

qt宏、顺序容器关联容器、迭代器、foreach关键字、库模块,嗨呀,没弄懂….以后再说

各类附加模块

qt界面修改尺寸——geometry

frame 框架修改

#frame{border:1px solid rgb(0,255,0)} //frame代表你需要设置边框的frame对象名,1px是边框的线宽,solid为边框形式为实线,rgb为边框颜色

css border:solid实线,dashed虚线;dotted点状,,double双线

border:0.5px solid rgb(25,25,25)

border:2px dashed rgb(255,15,15)

border:0px solid

关于Qstyle Stylesheet

如果你对某个widget设置QStyle,那么该样式只对该widget有效,其子widget不受影响;但如果设置样式表,那么所有的子widget会继承该样式表。

利用sheet实现只修改外部不修改内部

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
QGroupBox {
border-color: rgb(156, 156, 156);
border-width: 1px;
border-style: solid;
margin-top: 0.5ex;
} // 这里可以实现单部分修改
QGroupBox::title {
subcontrol-origin: margin;
subcontrol-position: top left;
left: 10px;
margin-left: 2px;
padding: 0 0px;
}
QpushButton {
border-color: rgb(255, 15, 15);
border-width: 2px;
border-style: dashed;
}

图像化设置圆形

一、使用setStyleSheet方法

使用的主要是使用border-radius 属性,关于这个属性,可选的样式有
border-top-left-radius 设置左上角圆角;
border-top-right-radius 设置右上角圆角;
border-bottom-left-radius 设置左下角圆角;
border-bottom-right-radius 设置右下角圆角;
border-radius 设置四个角圆角;

关于border-radius 后面的参数
(1)一个参数

(2)两个参数
border-radius: 15px 50px
第一个参数设置X轴方向的半径
第二个参数设置Y轴方向的半径

从图中可以看出设置一个参数代表X轴和Y轴设置了同样的值,而两个参数分别为X轴和Y轴方向的半径。大家可以根据不同需要去设置参数。

border:2px groove gray;border-radius:50px;padding:2px 4px solid

pushbutton样式选择

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
QPushButton{border-radius:10px;
border:2px solid white;
border:2px solid white;
color:white;
background:transparent;
}
QPushButton:hover{
border:2px solid rgb(71,186,204);
color:rgb(71,186,204);
background:transparent;
}
QPushButton:pressed{
border:2px solid white;
color:white;
background-color:rgb(71,186,204);
}
QPushButton:!enabled
{
border:2px solid rgb(130,130,130);
color:rgb(130,130,130);
}
QPushButton:focus {
border:2px solid black;
color:black;
background-color:white;

pushbutton与toolbutton

tool工具栏按钮

push 普通按钮

comm.h √ comm.cpp √

设置参数值不用管,使能 重置 停止 运行

难顶,浪费了一天时间

控制模型不改了,就用楼下的电脑修改就好

其余控制通过5.8进行,我可太笨了

关于ads通信,发送图片