本文介绍Qt的新旧两种信号合槽方法,其中新的方法在QT4.8中开始使用,QT4.8以后的版本建议使用新的方法。
函数声明:
QMetaObject::Connection QObject::connect(const QObject *sender, const char *signal, const QObject *receiver, const char *method, Qt::ConnectionType type = Qt::AutoConnection)
旧方法
优点:
在Qt的所有版本中都适用;针对所有控件都适用;
缺点:
书写相对复杂;槽函数必须在slot标签下,即public slots / protected slots / private slots。
例子:
-
没有参数
//在ui中添加按钮控件pushbutton //.h定义槽函数 private slots: void onBtnClicked(); //.cpp实现槽函数 void MainWindow::onBtnClicked() { qDebug() << "点击按钮"; } //.cpp信号合槽 MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent) , ui(new Ui::MainWindow) { ui->setupUi(this); connect(ui->pushButton, SIGNAL(clicked()), this, SLOT(onBtnClicked())); }
connect里的clicked()和onBtnClicked()即使没有参数,也不能省略括号
-
有参数
//在ui中添加按钮控件lineEdit //.h定义槽函数 private slots: void onLineEditTextChanged(QString text); //.cpp实现槽函数 void MainWindow::onLineEditTextChanged(QString text) { qDebug() << "更改文本:" << text; } //.cpp信号合槽 MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent) , ui(new Ui::MainWindow) { ui->setupUi(this); connect(ui->lineEdit, SIGNAL(textChanged(QString)), this, SLOT(onLineEditTextChanged(QString))); }
connect里的textChanged(QString)和onLineEditTextChanged(QString)只能有参数类型,不能有参数值
如果不使用参数,onLineEditTextChanged(QString)可以修改为onLineEditTextChanged(),即槽函数可以去掉参数,但是信号的QString参数是不能够省略的
新方法
优点:
书写简单(在信号合槽时不用写括号和任何参数);槽函数可以为任意的成员函数(当然也可以是slots标签的函数),普通全局函数,静态函数(即不需要在slots标签下)
缺点:
在Qt 4.8以后的版本中都适用;针对大部分控件适用;
之所以说大部分控件适用,是因为在使用QComboBox时发现connect(ui->comboBox, &QComboBox::currentIndexChanged,
this, &MainWindow::onComboBoxIndexChanged);不能使用,提示error: no matching member function for call to ‘connect’
//在ui中添加按钮控件pushButton 和 lineEdit
//.h定义成员函数
private:
void onBtnClicked();
void onLineEditTextChanged();
//.cpp实现成员函数
void MainWindow::onBtnClicked()
{
qDebug() << "点击按钮";
}
void MainWindow::onLineEditTextChanged(QString text)
{
qDebug() << "更改文本:" << text;
}
//.cpp信号合槽
MainWindow::MainWindow(QWidget *parent)
: QMainWindow(parent)
, ui(new Ui::MainWindow)
{
ui->setupUi(this);
connect(ui->pushButton, &QPushButton::clicked, this, &MainWindow::onBtnClicked);
connect(ui->lineEdit, &QLineEdit::textChanged,
this, &MainWindow::onLineEditTextChanged);
}
槽函数的声明和实现可以去掉参数,即可以将onLineEditTextChanged(QString text)修改为onLineEditTextChanged()