参考视频:黑马程序员https://www.bilibili.com/video/BV1XW411x7NU?p=4
1 新建工程
先创建一个控件基础工程,创建后的界面如下:
主函数我们不需要修改,就保持这样,对于C++的知识我不太理解。
上述代码中,执行到第7行的时候,会先去执行基类的构造函数,再执行MyWidget类的构造函数。我们只需要在构造函数中实现需要实现的功能。
构造函数对应在mywidget.cpp中:
2 测试代码
测试目的
在主窗口中,新建两个按钮,功能如下:
按钮一的功能:按下按钮,关闭主窗口;
按钮二的功能:释放按钮,更改按钮二的文本,并隐藏按钮一。
由于在实现过程中,会用到信号与槽的知识,就先简单介绍一下基本知识,可能不正确,这只是我个人的理解:
信号:某一事件发生时产生,用于表示一个事件发生了。
槽:就是信号处理函数,用于指示当信号发生时,需要做出什么动作。
其中,我们connect函数来连接信号与槽之间的关系,函数的原型如下:
connect(const QObject *sender, const QMetaMethod &signal, const QObject *receiver, const QMetaMethod &method, Qt::ConnectionType type = Qt::AutoConnection);
举例说明:
connect(&b1, &QPushButton::pressed, this, &MyWidget::close);
/* &b1:信号发出者,指针类型
* &QPushButton::pressed:处理的信号,&发送者的类名::信号名字
* this:信号接收者
* &MyWidget::close:槽函数,信号处理函数 &接收的类名::槽函数名字
*/
不同的控件有哪些信号,可通过帮助文档查看,以QPushButton为例进行说明(点QPushButton,再按F1):
这里没有看到signal函数,可能是从它的父类继承过来的,我们再看一下它的父类:
实现的相关代码
先在MyWidget类中实现两个按钮(mywidget.h):
1 #ifndef MYWIDGET_H 2 #define MYWIDGET_H 3 4 #include <QWidget> 5 #include <QPushButton> 6 7 class MyWidget : public QWidget 8 { 9 Q_OBJECT 10 11 public: 12 MyWidget(QWidget *parent = 0); 13 ~MyWidget(); 14 15 private: 16 QPushButton b1; 17 QPushButton *b2; 18 19 void myslot(); 20 21 }; 22 23 #endif // MYWIDGET_HView Code
再在构造函数中实现两个按钮的功能(mywidget.cpp):
1 #include "mywidget.h" 2 #include <QPushButton> 3 4 MyWidget::MyWidget(QWidget *parent) 5 : QWidget(parent) 6 { 7 b1.setParent(this); 8 b1.setText("按钮一"); 9 b1.move(100, 100); 10 11 b2 = new QPushButton(this); 12 b2->setText("按钮二"); 13 14 connect(&b1, &QPushButton::pressed, this, &MyWidget::close); 15 /* &b1:信号发出者,指针类型 16 * &QPushButton::pressed:处理的信号,&发送者的类名::信号名字 17 * this:信号接收者 18 * &MyWidget::close:槽函数,信号处理函数 &接收的类名::槽函数名字 19 */ 20 21 /* 22 * 自定义槽,普通函数的用法 23 * Qt5:任意的成员函数,普通全局函数,静态函数 24 * 槽函数需要和信号一致(参数、返回值) 25 * 由于信号都是没有返回值,所以槽函数一定没有返回值 26 */ 27 connect(b2, &QPushButton::released, this, &MyWidget::myslot); 28 29 connect(b2, &QPushButton::released, &b1, &MyWidget::hide); 30 /* 31 * 信号:短信 32 * 槽函数:接收短信的手机 33 */ 34 } 35 36 void MyWidget::myslot() 37 { 38 b2->setText("123"); 39 } 40 41 MyWidget::~MyWidget() 42 { 43 44 }View Code
运行,进行测试: