- 如果我们要自定义组件,最好还是在主函数以外的地方执行,这种思想是:一切自定义的控件,其属性,行为等都应该在窗口初始化的时候完成
#include "mainwindow.h" #include <QApplication> int main(int argc, char *argv[]) { QApplication a(argc, argv); MainWindow w;//构造函数----执行窗口初始化 w.show(); return a.exec(); }
信号:
遭遇中断,执行程序决定是否停下来,处理信号
槽函数:
一句话-------信号与槽是Qt控件之间通信的接口
信号接收到之后,用于处理信号的函数
Qt的核心思想是信号与槽,那么基本操作方法是调用connect(a,b,c,d)函数通过相关控件,发送信号,并指定信号的接受者,给接收者委派处理信号的函数
具体操作步骤
- 定义发送信号的控件(connect函数参数列表的第一个参数,数据类型为指针)
- 控件执行什么动作时发送信号(Qt官方为控件定义的信号,其检索方式见番外篇)
- 定义信号的接收者(通常也是指针)
- 处理信号时调用的函数(槽函数简称槽)
connect(qb,&QPushButton::pressed,this,&mywidget::close);
丁大锅定义的控件
- 创建项目--仅列出关键步骤
class name可以随便取,我决定改成mywidget
- 项目文件构成
- 定义窗体的控件为窗体类的私有属性,---否则运行窗体时会出现控件不出现的情况 这需要在窗体类的头文件中完成定义
#ifndef MYWIDGET_H #define MYWIDGET_H #include <QWidget> #include<QPushButton> class mywidget : public QWidget { Q_OBJECT public: mywidget(QWidget *parent = 0); ~mywidget(); private: QPushButton *qb;//这就是稍后发送信号的主角,这里声明为指针 }; #endif // MYWIDGET_H
- 按照文章开头提出的规划,自定义的控件都要在初始化的时候完成,那么在窗体类的实现文件mywidget.cpp中
#include "mywidget.h" #include <QPushButton> mywidget::mywidget(QWidget *parent) : QWidget(parent) { this->setGeometry(QRect(100,200,600,400)); this->setWindowTitle(QString("昌仔和我")); qb=new QPushButton(this); qb->setText("喜欢昌仔"); qb->move(20,20); qb->show(); connect(qb,&QPushButton::pressed,this,&mywidget::close); } mywidget::~mywidget() { }
输出结果
效果:一点击 按钮 窗体就会关闭
- 番外篇----connect()函数里的信号怎么选择
以QPushButton为例,我们希望在点击按钮后,由窗体接受信号,窗体处理这个信号时调用了槽函数close,那么我们如何找到Qt官方为点击按钮所写的信号呢
我们把光标放在控件所树的类名处点击F1
你的IDE会出现,(如果再次按下F1,右边的官方文档会挤占编辑器的界面空间)
我们要检索signal(),显然,QPushButoon中我们并没有找到signal()的用法及其说明
这并不意味着该控件没有signal信号的用法,而是可能在QPushButton的父类中
inherits,表示继承自哪个控件,点击链接
接下来,你按图索骥就是了,点击signal,检索出多个signal,点击查看,按需索取即可。
connect(qb,&QPushButton::pressed,this,&mywidget::close); 父类中存在的方法,子类中一定存在