QT学习笔记(4) 信号和槽
一、代码编写
在上一次的学习中,我们把所有的控件布局和控制信息都放在主函数中,这样极其不方便开发和维护。
然后我们又发现在打开一个窗体时,其实最开始是先执行的构造函数。所以我们就想到可以把当前对象和子对象的控制信息写到其构造函数中,这样的话就可以控制层次关系了。
但是我们又不能直接把子对象当成构造函数的局部变量,(如果当成构造函数的局部变量的话,在从构造函数中跳转出来的时候,变量就消失了,无法实现想要的功能)
1 #include "mainwidget.h" 2 #include <QPushButton> 3 MainWidget::MainWidget(QWidget *parent) 4 : QWidget(parent) 5 { 6 //此处是一个错误的示范 7 //因为如果这样定义的话,就相当于是构造函数里面的局部变量 8 //在从构造函数中跳转出来之后,变量就消失了,无法实现想要的功能 9 /* 10 QPushButton b; 11 b.setParent(this); 12 b.setText("-_-"); 13 */ 14 } 15 16 MainWidget::~MainWidget() 17 { 18 19 }
所以我们可以以成员变量的形式,存储在父对象中,然后在父对象的构造函数中以设置成员变量属性的形式,对子对象进行操作。
主要代码如下:
MainWidget.h文件
1 #ifndef MAINWIDGET_H 2 #define MAINWIDGET_H 3 4 #include <QWidget> 5 #include <QPushButton> 6 class MainWidget : public QWidget 7 { 8 Q_OBJECT 9 10 private: 11 //以成员变量的形式,存储在父对象中。 12 QPushButton b1; 13 QPushButton *b2; 14 15 public: 16 MainWidget(QWidget *parent = 0); 17 ~MainWidget(); 18 }; 19 20 #endif // MAINWIDGET_H
MainWidget.cpp文件
1 #include "mainwidget.h" 2 #include <QPushButton> 3 MainWidget::MainWidget(QWidget *parent) 4 : QWidget(parent) 5 { 6 //此处是一个错误的示范 7 //因为如果这样定义的话,就相当于是构造函数里面的局部变量 8 //在从构造函数中跳转出来之后,变量就消失了,无法实现想要的功能 9 /* 10 QPushButton b; 11 b.setParent(this); 12 b.setText("-_-"); 13 */ 14 15 //然后以设置成员变量属性的形式,就可以对子对象进行操作了 16 b1.setParent(this);//设置父对象 17 b1.setText("-_-"); 18 b1.move(100,100); 19 //如果是指针类型,必须动态分配空间 20 b2 = new QPushButton(this);//构造函数指定父对象 21 b2->setText("aaa");//指针对象的方法,必须用->来指向 22 } 23 24 MainWidget::~MainWidget() 25 { 26 27 }
二、标准信号和槽
在QT中使用信号和槽机制来完成对象之间的协同操作
简单来说,信号和槽都是函数,比如按下窗口上的一个按钮后想要弹出一个对话框,那么就可以将这个按钮的单击信号和我们定义的槽关联起来,在这个槽中可以创建一个对话框,并且显示它。这样,当单击这个按钮时就会发射信号,进而执行我们的槽来显示一个对话框。
关联方式:
(1)使用connect()关联
这里自定义了一个槽,槽一般使用slots关键字进行修饰(Qt 4中必须使用,Qt 5使用新connect语法时可以不用,为了与一般函数进行区别,建议使用),这里使用了public slots,表明这个槽可以在类外被调用。
clicked()信号在QPushButton类中进行了定义,而connect()是QObject类中的函数,因为我们的类继承自QObject,所以可以直接使用它。
connect()函数中的四个参数分别是:发送信号的对象、发送的信号、接收信号的对象和要执行的槽。
示例代码如下:
MainWidget.h文件
1 #ifndef MAINWIDGET_H 2 #define MAINWIDGET_H 3 4 #include <QWidget> 5 #include <QPushButton> 6 class MainWidget : public QWidget 7 { 8 Q_OBJECT 9 10 private: 11 //以成员变量的形式,存储在父对象中。 12 QPushButton b1; 13 QPushButton *b2; 14 15 public: 16 MainWidget(QWidget *parent = 0); 17 ~MainWidget(); 18 19 //自定义的槽函数 20 void myslot(); 21 }; 22 23 #endif // MAINWIDGET_H
MainWidget.cpp文件
1 #include "mainwidget.h" 2 #include <QPushButton> 3 MainWidget::MainWidget(QWidget *parent) 4 : QWidget(parent) 5 { 6 //此处是一个错误的示范 7 //因为如果这样定义的话,就相当于是构造函数里面的局部变量 8 //在从构造函数中跳转出来之后,变量就消失了,无法实现想要的功能 9 /* 10 QPushButton b; 11 b.setParent(this); 12 b.setText("-_-"); 13 */ 14 15 //然后以设置成员变量属性的形式,就可以对子对象进行操作了 16 b1.setParent(this);//设置父对象 17 b1.setText("-_-"); 18 b1.move(100,100); 19 //如果是指针类型,必须动态分配空间 20 b2 = new QPushButton(this);//构造函数指定父对象 21 b2->setText("aaa");//指针对象的方法,必须用->来指向 22 23 /* &b1 信号发出者,指针类型 24 * &QPushButton::pressed 处理的信号,&发送者的类名::信号名字 25 * this 信号接收者 26 * &MainWidget::close 槽函数,信号处理函数,&接收的类名::槽函数名字 27 */ 28 connect(&b1,&QPushButton::pressed,this,&MainWidget::close); 29 30 31 /* 自定义槽,普通函数的用法 32 * QT5:任意的成员函数,普通全局函数,静态函数 33 * 槽函数需要和信号一致(参数,返回值) 34 * 由于信号都是没有返回值,所以,槽函数一定没有返回值 35 */ 36 connect(b2,&QPushButton::released,this,&MainWidget::myslot); 37 38 } 39 40 MainWidget::~MainWidget() 41 { 42 43 } 44 //槽函数的具体实现 45 void MainWidget::myslot() 46 { 47 b2->setText("123"); 48 }
(2)在设计模式关联
(3)自动关联