Qt开发学习笔记
项目开发个人Qt学习记录,前期只是学习相关概念,记录一些基础知识,后面会补充一些具体的操作实例
1、信号和槽
Q_OBJECT 宏,在private部分加入后,使得类可以使用元对象的特性,如动态属性、信号和槽
信号和槽
信号和槽的连接方式:
connect(信号的发送者,发送的具体信号[函数的地址],信号的接收者,信号的处理[槽函数,也是地址]);
示例:按钮——点击——窗口——关闭
槽的优点:松散耦合,信号发送端和接收端本身是无关联的,通过connect连接,将两端耦合在一起
信号的使用
- 自定义信号写到signals下
- 返回值是void,只写声明,无需实现
- 可以有参数,也可以重载
槽的使用
- 自定义槽早期要写到slots下,之后可以写在public下了
- 返回值也是void,需要声明,也需要实现
- 可以有参数,可以发生重载
信号的触发
emit 可以用来触发信号,需要调用
信号与槽的应用
- 当使用信号和槽发生重载的时候,单一的地址写法出错时,定义显式的函数指针(标明函数地址)向connect传参;
- 信号可以连接信号;
- 断开信号使用disconnect
- 信号和槽函数的参数类型必须一一对应
- 但是信号的参数个数可以大于等于槽的参数个数
lambda表达式
[] 之中可以是:
- = 表示以值传递的方式传入
- & 表示以引用的形式传递
- a也可以直接传入某个对象(等同于值传递)
- [=,&a] 表示a以引用形式传递的方式传入,其余的对象以值传递的方式传入
- 值传递的对象,传入的都是副本,真正的对象的值不进行修改,修改的是副本的值
- 可以使用mutable关键字对传入的对象进行修改
2、QMainWindows
QMainWindows是一个为用户提供主窗口程序的类,包括:
- 一个菜单栏(menu bar)
- 多个工具栏(tool bars)
- 多个锚接部件(dock widgets)
- 一个状态栏(status bar)
- 一个中心部件(central widget)
2.1 菜单栏和工具栏
菜单栏的
/*包含头文件 QMenuBar*/
//菜单栏的创建 最多只能有一个
QMenuBar * bar = menuBar();
//将菜单栏放到窗口中
setMenuBar(bar);//默认是空的 什么都没显示
//创建菜单
QMenu * fileMenu = bar->addMenu("文件");
QMenu * editMenu = bar->addMenu("编辑");
QMenu * buildMenu = bar->addMenu("构建");
//创建菜单项
QAction * newAction = fileMenu->addAction("新建");
//添加分隔符
fileMenu->addSeparator();//添加一条分割线
QAction * openAction = fileMenu->addAction("打开");
工具栏的
/*头文件 QToolBar*/
//工具栏的创建 可以有多个
QToolBar * toolBar = new QToolBar(this);
addToolBar(toolBar);//添加到窗口中,默认位置在左侧
//更改默认停靠位置 addToolBar(Qt::LeftToolBarArea,toolBar);
//后期设置 只允许 左右停靠
toolBar->setAllowedAreas(Qt::LeftToolArea | Qt::RightToolArea);
//设置浮动
toolBar->setFloatable(false);//不允许浮动
//设置移动 (总开关)
toolBar->setMovable(false);//不允许任何移动
//工具栏中设置内容
toolBar->addAction(newAction);
//添加分割线 toolBar->addSeparator();
toolBar->addAction(openAction);
//工具栏中添加按钮控件
QPushButton * btn = new QPushButton("aa",this);
toolBar->addWidget(btn);
2.2 状态栏、锚接部件、中心部件
状态栏
/*头文件:QStatusBar*/
//状态栏 最多有一个
QStatusbar * stBar = statusBar();
//设置到窗口中
setStatusBar(stBar);
//放标签控件
QLabel * label = new QLabel("提示信息",this);
stBar->addWidget(label);
QLabel * label2 = new QLabel("右侧提示信息",this);
stBar->addPermanentWidget(label2);
锚接部件
/*头文件:QDockWidget*/
//锚接部件 (浮动窗口) 最多只有一个
QDockWidget * dockWidget = new QDockWidget("浮动",this);
//默认位置在下
addDockWidget(Qt::bottomDockWidget,dockWidget);
//设置后期停靠区域,只允许上下
dockWidget->setAllowedAreas(Qt::TopDockWidgetArea | Qt::bottomDockWidgetArea);
中心部件
//设置中心部件 只能一个
QTextEdit * edit = newQTextEdit(this);//记事本部件
setCentralWidget(edit);
3、资源文件添加
绝对路径添加图标:
ui->actionNew->setIcon("c:/Inmage...");
//缺点写死了 不方便移植
使用添加Qt资源:
-
1)先将图标资源文件夹放入项目路径下
-
2)右键项目 添加新文件 Qt ResourcesFile 选择资源文件夹 重命名
-
3)打开方式:
-
4)添加资源-》添加前缀 选择添加 -》编译后 就可以了
-
5)代码
//添加Qt资源 : ":+前缀名 + 文件名" ui->actionNew->setIcon(QIcon(":/wenjainming.png"))
4、对话框
示例:点击新建按钮,弹出一个对话框
头文件:QDialog
connect(ui->actionNew,&QAction::triggered,[=](){
//对话框分类
//非模态对话框(可以对其他窗口进行操作的) //模类对话框(不可以对其他窗口进行操作)
//模态创建 阻塞方式
QDialog dlg(this);//=模式传入
dlg.resize(200,100);//对话框太小会警告
dlg.exec();
qDebug()<<"模态对话框弹出来";
//非模态对话框
//QDialog dlg(this);栈上申请会消失
QDialog * dlg2 = newQDialog(this);//=模式传入
dlg2 ->resize(200,100);//对话框太小会警告
dlg2->show();
dlg2->setAttribute(Qt::WA_DeleteOnCLose);//55 属性,让其时间久之后自动关闭 以防堆栈溢出
qDebug() << "非模态对话框弹出了";
});