一般的,将槽函数和信号连接在一起,要使用connect函数,例如:
MyWindow::MyWindow()
{
m_ui = new Ui::MyWindowUI();
m_ui->setupUi(this);
connect(m_ui->btnShowMsg, SIGNAL(clicked()), this, SLOT(onClicked()));
}
MyWindow::~MyWindow()
{
}
void MyWindow::onClicked()
{
QMessageBox::information(this, "MyWindow","Clicked", QMessageBox::Ok);
}
将btnShowMsg的click信号连接到槽函数onClicked上。点击按钮,效果如下:
程序员喜欢偷懒,可以不用写connect,也能让QPushButton的click信号与某个槽函数相连吗?答案是肯定的,Qt可以在内部为我们默默的做这些事情。
先看代码
MyWindow::MyWindow()
{
m_ui = new Ui::MyWindowUI();
m_ui->setupUi(this);
}
MyWindow::~MyWindow()
{
}
void MyWindow::on_btnShowMsg_clicked()
{
QMessageBox::information(this, "MyWindow", "on_btnShowMsg_Clicked", QMessageBox::Ok);
}
在代码中,并没有connect函数,但是槽函数on_btnShowMsg_clicked()依旧可以响应。效果如下:
有两点疑惑:
- 槽函数on_btnShowMsg_clicked是与哪个信号连接的?
- 连接的动作在哪里执行的?
第1点很好回答,槽函数on_btnShowMsg_clicked是与btnShowMsg的clicked信号连接的。因为,点击按钮,槽函数就会响应。
对于第2点,还是要从代码来分析。
在我们写的代码中,却是没有连接的动作,但是,qt的uic编译器会生成一个头文件,在头文件中取找代码。确实,此动作在ui_mywindow.h文件中执行的。
在ui_mywindow.h文件中,有这样的一行代码。进入里面看看实现。
qobject.cpp
分析代码,大概的逻辑是:先找到此对象以及自对象的所有槽函数。然后对槽函数的签名前三个字符进行匹配(前三个字符是否为"on_")。若匹配成功,则将第4个字符到下一个""之间的字符与此对象以及子对象的objectname进行匹配,若匹配成功。则将第二个""后面的字符当做信号的签名,进行连接。
从以上的分析,可以知道要想自动连接信号与槽函数,槽函数的命名有一定的要求。
on_<objectname>_<signal>
例如上面的槽函数就如此。
objectname可以通过调用setObjectName进行设置。
虽然qt提供了此机制,但是,不建议这样使用,因为这样会使代码变得很莫名其妙,并且槽函数的命名也有要求。再者,明确的使用connect函数,可以使代码逻辑更加的清晰明了。