目录
自定义信号
自定义槽函数是非常关键的,在开发中大部分情况都是需要自定义槽函数的。
槽函数,就是用户触发某个操作之后,要进行的业务逻辑
自定义信号,比较少见,在实际开发中很少会需要自定义信号。
信号就对应到用户的某个操作。
在GUI,用户能够进行哪些操作,是可以穷举的,在Qt中内置的信号,基本已经覆盖到了上述所有可能的用户操作。因此使用Qt内置的信号,旧足以应付大部分的开发场景。
widget这个类中虽然没有定义任何信号,由于继承自Qwidget和QObject,这俩个类里面已经提供了一些信号,可以直接使用。
所谓的Qt信号,本质上就是一个”函数“。
Qt5已经更高版本中,槽函数和普通的成员函数之间已经没有区别;但是信号则是一类特殊的函数:
- 只需要写出函数声明,并且告诉Qt这是一个”信号“即可,这个函数的定义,是Qt在编译过程中,自动生成的(自动生成的过程,程序员无法进行干预)。因为信号在Qt中式特殊的机制,Qt生成的信号函数的实现,要配合Qt框架左很多既定的操作。
- 作为信号函数,这个函数的返回值,必须式void,有没有参数都可以,甚至也可以支持重载。
这个signals也是Qt自己扩展出来的关键字,在qmake的时候,调用一些代码的分析/生成工具,扫描到类中包含signals这个关键字的时候,此时,就会自动的把下面的函数声明认为是信号,并且给这些信号函数自动的生成函数定义。
#ifndef WIDGET_H
#define WIDGET_H
#include <QWidget>
QT_BEGIN_NAMESPACE
namespace Ui { class Widget; }
QT_END_NAMESPACE
class Widget : public QWidget
{
Q_OBJECT
public:
Widget(QWidget *parent = nullptr);
~Widget();
signals:
void mySignal();
public slots:
void handleMySignaal();
private:
Ui::Widget *ui;
};
#endif // WIDGET_H
#include "widget.h"
#include "ui_widget.h"
Widget::Widget(QWidget *parent)
: QWidget(parent)
, ui(new Ui::Widget)
{
ui->setupUi(this);
connect(this, &Widget::mySignal, this, &Widget::setWindowTitle);
}
Widget::~Widget()
{
delete ui;
}
void Widget::handleMySignaal()
{
this->setWindowTitle("自定义信号");
}
建立好联系之后,还需要将信号发送出去。
对于Qt内置的信号,都不需要手动通过代码来触发,用户在GUI进行某些操作,就会自动触发对应信号(发射信号的代码已经内置到Qt框架中了)。
关键字:emit 发射
发射信号的操作,可以在任意合适的代码中。
这样就可以完成自定义信号了。
也可以通过点击按钮的方式,进行对窗口的编辑。