文章目录
Qt5 笔记
Qt配置问题
主界面->New Project -> 选择一个模板中选择 Application -> Qt Widgets Application -> location中 名称 自己新建项目的名字(主窗口的名字首字母大写:XxxXxx) -> 创建路径 随便选但是不能含有中文名字 -> Kits 中选择编译器(有MSVC2015 mingw 32bit 64bit) -> Details 类名 可以与新建项目名称一样,基类 有QMainWindow、QWidget、QDialog三个类 此时会自动产生 与类名一致的.h 、.cpp、.ui文件 -> 完成
->
- QWidget所有窗口的父类,派生QMainWindow、QDialog
- QDialog对话窗口,提示密码输入有误等只有一个红色×
中文乱码问题
编码格式问题,解决方法:Qt菜单栏 工具->选项->文本编辑器->行为->文件编码中 看是否是选择的UTF-8,一般选择后,重新新建项目就不会有中文乱码了。
常用快捷键
- F4 .cpp与.h文件相互切换
- 光标处+F1 查找Qt内部函数的帮助文档 两次F1 帮助文档全屏 退出 ESC
- 光标处+F2 查找本项目中 函数的定义
- Alt+光标选中移动 选中一列代码
Qt知识点问题
1.信号与槽问题
信号和槽都是函数,区别是信号不用实现,槽需要实现
形式:
connect(&Sender(信号发出者),&Send::signal(信号的发出者所属的类::发出的信号函数),&Reviewer(信号接收者),&Review::slot(信号接受者所属的类::槽函数));
槽函数中的参数≤信号函数中的参数
connect(&sender,&SubWidget::sig(a,b,c...),&reviewer,&QMainWindow::slot(m,n,k))
信号与槽函数对应关系非常灵活,可以一一对应,也可以一对多,多对一,可以信号即是发送者也是接受者,同一个信号可以连接多个槽函数。
信号重载
Qt5方法:信号与槽函数重载需要使用函数指针
eg:
int fn(int a,long b);
int (*fnnp)(int,long) = fn;//知fn有两个参数
//若重载信号与槽函数,则需定义一个函数指针来分辨重载的信号与槽函数,以重载信号函数为例
//在类SubWidget定义重载信号函数
void sigSub();
void sigSub(int,QString);
//在类MainWidget定义重载的信号函数分别对应的槽函数
void slotShow();
void slotHide(int num,QString str);
//定义函数指针区分重载的信号函数
void(SubWidget::*MySig)() = SubWidget::sigSub;
void(SubWidget::*MySigPlus)(int,QString) = SubWidget::sigSub;
//连接重载信号与对应的槽函数
SubWidget SubW;
connect(&SubW,MySig,this,&MainWidget::slotShow);
connect(&SubW,MySigPlus,this,&MainWidget::slotHide);
Qt4 方法(相比于Qt5 可以运行但不会报错)
//SIGNAL() SLOT() 宏 将函数传给字符串
//Qt4 槽函数必须以public/protected/private slot: 形式声明
connect(&subW,&SIGNAL(sigSub()),this,SLOT()slotShow()));
connect(&subW,&SIGNAL(sigSub(int,QString)),this,SLOT(slotHide(aa,bb)));
- 信号与槽函数一一对应
connect(&Sender(信号发出者),&Send::signal(信号的发出者所属的类::发出的信号函数),&Reviewer(信号接收者),&Review::slot(信号接受者所属的类::槽函数));
- 信号与槽函数一对多
void sigSub();
//在类MainWidget定义单一信号函数对应的不同槽函数
void answer();
void answer(QString);
//定义函数指针区重载的槽函数
void(MainWidget::*MyAnswer)() = MainWidget::answer;
void(MainWidget::*MyAnswerPlus)(QString) = MainWidget::answer;
//连接重载信号与对应的槽函数
SubWidget SubW;
connect(&SubW,SubWidget::sigSub(),this,MyAnswer);
connect(&SubW,SubWidget::sigSub(),this,MyAnswerPlus);
- 信号连接信号(第二个信号的参数≤第一个信号的参数个数)
//发出信号,因为weituoLoveletter没有参数所以sendletter不能带参
connect(&xiaoming,&Boy::weituoLoveletter(),&xiaohong,&Girl::sendLetter());
//指定谁来处理小红的信号
connect(&xiaohong,&Girl::sendLetter(),&xiaolan,&Girl::reject());
2.ui文件
MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent),
number(10),
ui(new Ui::MainWindow)//c++初始化,可以在这定义 也可以写到下面的中括号里
{
ui->setupUi(this);
// number = 10;//在mainwindow.h 对其类已经做了定义 private :int intnumber;
}
- 菜单栏输入中文
在ui界面的右下方配置属性编辑器栏中找到 text选项 在其中输入中文即可,对菜单栏中按钮进行功能配置进行信号连接时,QAction触发一般是triggered
connect(ui->actionOpen,&QAction::triggered,...);
- 进行打开ui界面菜单栏file,需要#include,QFileDialog属于QWidgets模块,派生于QDialog,一般我们使用它的静态变量(Static Public Members),getExistingDirectory(获取已经存在的目录)、getOpenFileNames(获得存在的多个文件名)、getOpenFileName(获得存在的单个文件名)、getSaveFileName(保存文件)
//ui界面菜单栏:File->Open 功能是 打开D盘中的.jpg,.png图片格式的文件
connect(ui->actionOpen,&QAction::triggered,this,[=](){
QString name = QFileDialog::getOpenFileName(this,"打开文件","D:\\","Image (.jpg,.png)");
//打印出来
qDebug()<<name.toUtf8().data();
});
- ui界面工具栏
可以直接将上面第一幅图中第二个红色箭头的actionSave用鼠标拖到工具栏处,其功能与菜单栏中的save功能一样。最后结果如图:
-
浮动窗口
ui界面中 左侧filter 中 Containers中的Dock Widget ,鼠标点击拖动到ui界面中 在运行后 ui界面中就会有一个可以拖动到外面的浮动窗口(像是VS中 属性管理器、解决方案管理器),并且浮动窗口中可以添加控件(如Buttons),在左侧的的对象中选中,然后在下面的属性窗口中对其名字windowTitle(名字)进行命名等; -
状态栏
<