- Qt5时代对信号槽运行机制据说有了很大的改进。
- 在Qt5之前,connect一般都只能这么写connect(sender, SIGNAL(signalFunc()), receiver, SLOT(receiveFunc())),就是说在connect的时候,必须把信号用宏SIGNAL包裹起来,把槽函数用宏SLOT包裹起来,这样才能被Qt的Moc机制识别;
- 在编译的时候即使信号或槽不存在或者参数不正确也不会报错,但是在执行的时候无效,会打印提示,对于C++这种静态语言来说,这是不友好的,不利于调试;
- 但是Qt5之后更加推荐"取地址的写法",采用这种写法,如果编译的时候信号或槽不存在是无法编译通过的,相当于编译时检查,不容易出错;
- 如果没有历史遗留问题需要兼容Qt4的话,还是推荐用新写法,有类型检查更严格,而且支持的写法多样非常灵活;
- 一些简单的处理逻辑强烈推荐直接lambda表达式直接处理完;
class MainWindow : public QMainWindow
{
Q_OBJECT
public: MainWindow(QWidget *parent = 0);
~MainWindow();
private:
Ui::MainWindow *ui;
private:
void test_fun();
private slots:
void test_slot();
};
MainWindow::MainWindow(QWidget *parent)
: QMainWindow(parent)
, ui(new Ui::MainWindow)
{
ui->setupUi(this);
connect(ui->pushButton, SIGNAL(clicked()), this, SLOT(test_slot()));
connect(ui->pushButton, &QPushButton::clicked, this, &MainWindow::test_fun);
connect(ui->pushButton, &QPushButton::clicked, this, &MainWindow::test_slot);
connect(ui->pushButton, &QPushButton::clicked, [this] {test_fun();});
connect(ui->pushButton, &QPushButton::clicked, [this] {
qDebug() << "hello lambda";
});
connect(ui->pushButton, &QPushButton::clicked, [&] (bool isCheck) {
qDebug() << "hello lambda" << isCheck;
});
connect(this, &MainWindow::sig_test, [] (int i) {
qDebug() << "hello lambda" << i;
});
emit sig_test(5);
}
MainWindow::~MainWindow()
{
delete ui;
}
void MainWindow::test_fun()
{
qDebug() << "test_fun";
}
void MainWindow::test_slot()
{
qDebug() << "test_slot";
}