Window系统下开发Qt(6)-- Qt默认连接槽和信号

166 阅读2分钟

 一般的,将槽函数和信号连接在一起,要使用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()依旧可以响应。效果如下:

 有两点疑惑:

  1. 槽函数on_btnShowMsg_clicked是与哪个信号连接的?
  2. 连接的动作在哪里执行的?

第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函数,可以使代码逻辑更加的清晰明了。