我想用自己的样式和布局构建类似QMessageBox的东西。因此,我正在跟踪qt的源代码并从中学习。
QMessageBox由一些标签小部件作为内容,而QDialogButtonBox作为按钮。
int ret = QMessageBox::warning(nullptr, QString("My Application"),
QString("Dialog content"),
QMessageBox::Save | QMessageBox::Cancel,
QMessageBox::Save)
上面的代码片段构建了一个简单的QMessageBox,其中包含两个按钮,分别是保存和取消。
在源代码中,qt将添加两个在qdialogbuttonbox.cpp
中被单击和已销毁的连接的按钮void QDialogButtonBoxPrivate::addButton(QAbstractButton *button,
QDialogButtonBox::ButtonRole role,
bool doLayout)
{
Q_Q(QDialogButtonBox);
QObject::connect(button, SIGNAL(clicked()), q, SLOT(_q_handleButtonClicked()));
QObject::connect(button, SIGNAL(destroyed()), q, SLOT(_q_handleButtonDestroyed()));
buttonLists[role].append(button);
if (doLayout)
layoutButtons();
}
在QMessageBox中单击“取消”按钮时,它将运行
q->done(execReturnCode(button)); // does not trigger closeEvent
在qmessgebox.cpp和return from event loop中并销毁QMessageBox实例。
据我了解,销毁QMessageBox时,所有按钮也会被销毁,因此它应该触发_q_handleButtonDestroyed处理程序并引起一些奇怪的行为。
我在IDE中设置了一些断点并运行。单击按钮不会进入_q_handleButtonDestroyed。它还不会进入qdialogbuttonbox.cpp的#663和#726行中的所有断开连接
我想知道单击按钮时在哪里断开_q_handleButtonDestroyed连接?还是我错了?
谢谢。