Qt信号与槽之标准信号
Qt信号与槽之标准信号
标准信号:Qt预定义好的信号
这里将通过实例演示标准信号的使用
实例任务如下:
- 创建一个窗口w,其包含b1和b2两个按钮
- 按钮b1的内容为"abc",当按下时会变为"123"
- 按钮b2的内容为"close",当松开时关闭窗口
实验步骤如下:
-
新建项目
-
New Project --> Application --> Qt Widgets Application --> Choose
-
设置项目名称(SignalAndSlot)和路径 --> 下一步 --> 下一步
-
进行如下设置:
-
下一步 --> 完成
-
-
在mainwidget.h中为MainWidget类添加私有成员b1和b2
#include <QPushButton> //...(表示代码省略,下同) private: QPushButton b1; QPushButton b2;
-
在mainwidget.cpp中实现MainWidget类的构造函数
MainWidget::MainWidget(QWidget *parent) : QWidget(parent) { resize(600, 400); setWindowTitle("老大"); b1.setParent(this); b1.setText("abc"); b2.setParent(this); b2.setText("close"); b2.move(200, 200); connect(&b1, &QPushButton::pressed, this, &MainWidget::changeText); connect(&b2, &QPushButton::released, this, &MainWidget::close); }
-
经过以上步骤后,在changeText处会提示出错,这是因为还没在MainWidget中定义changeText,我们需要进一步声明和定义changeText
- 在mainwidget.h中声明
public: void changeText();
- 在mainwidget.cpp中定义
void MainWidget::changeText() { b1.setText("123"); }
-
Ctrl+R编译运行,测试实验效果
完整代码如下:
-
mainwidget.h
#ifndef MAINWIDGET_H #define MAINWIDGET_H #include <QWidget> #include <QPushButton> class MainWidget : public QWidget { Q_OBJECT public: MainWidget(QWidget *parent = 0); ~MainWidget(); void changeText(); private: QPushButton b1; QPushButton b2; }; #endif // MAINWIDGET_H
-
mainwidget.cpp
#include "mainwidget.h" MainWidget::MainWidget(QWidget *parent) : QWidget(parent) { //窗口 resize(600, 400); setWindowTitle("老大"); //按钮b1 b1.setParent(this); b1.setText("abc"); //按钮b2 b2.setParent(this); b2.setText("close"); b2.move(200, 200); //信号与槽:Qt对象之间通信的接口 //信号与槽如同短信和手机:一个信号可以被多个槽接收 //信号发出者、处理的信号、信号接收者、槽函数(信号处理函数) connect(&b1, &QPushButton::pressed, this, &MainWidget::changeText); connect(&b2, &QPushButton::released, this, &MainWidget::close); } MainWidget::~MainWidget() { } //可以像定义普通函数一样自定义槽函数 //在Qt5中,槽可以为任意的成员函数,普通全局函数,静态函数 //槽函数需要与信号一致(参数,返回值),因为信号都没有返回值,所以槽函数一定没有返回值 void MainWidget::changeText() { b1.setText("123"); }
-
main.cpp
#include "mainwidget.h" #include <QApplication> int main(int argc, char *argv[]) { QApplication a(argc, argv); MainWidget w; //执行MainWidget的构造函数 w.show(); return a.exec(); }