使用connect()可以让我们连接系统提供的信号和槽。但是,Qt 的信号槽机制并不仅仅是使用系统提供的那部分,还会允许我们自己设计自己的信号和槽。
mainwindow.h
#ifndef MAINWINDOW_H
#define MAINWINDOW_H
#include <QMainWindow>
#include <QPushButton>
class MainWindow : public QMainWindow
{
Q_OBJECT
public:
MainWindow(QWidget *parent = nullptr);
~MainWindow();
void myslot(); // 槽函数:返回值必须是void
signals: // 表示下面的是信号
void mysignal(); // 信号:返回值必须是void
private:
QPushButton b;
};
#endif // MAINWINDOW_H
mainwindow.cpp
#include "mainwindow.h"
MainWindow::MainWindow(QWidget *parent)
: QMainWindow(parent)
{
b.setParent(this);
b.setText("Yes->No");
b.setGeometry(10,10,100,100);
b.show();
connect(&b, &QPushButton::clicked, this, &MainWindow::myslot); // 将按钮信号和新槽函数绑定到一起
connect(this, &MainWindow::mysignal, this, [=](){b.setText("No");}); // 将新信号与lambda表达式绑定到一起
}
void MainWindow::myslot()
{
emit mysignal(); // 发送信号
}
MainWindow::~MainWindow()
{
}
自定义信号槽需要注意的事项
- 一个信号可以和多个槽相连
如果是这种情况,这些槽会一个接一个的被调用,但是它们的调用顺序是不确定的。 - 多个信号可以连接到一个槽
只要任意一个信号发出,这个槽就会被调用。 - 一个信号可以连接到另外的一个信号
当第一个信号发出时,第二个信号被发出。除此之外,这种信号-信号的形式和信号-槽的形式没有什么区别。 - 槽可以被取消链接
这种情况并不经常出现,因为当一个对象delete之后,Qt自动取消所有连接到这个对象上面的槽。 - 使用Lambda 表达式