在QDialogBu​​ttonBox中,当对话框关闭时,它在哪里断开按钮的破坏连接?

时间:2018-08-17 09:40:30

标签: qt qt5 qmessagebox

我想用自己的样式和布局构建类似QMessageBox的东西。因此,我正在跟踪qt的源代码并从中学习。

QMessageBox由一些标签小部件作为内容,而QDialogBu​​ttonBox作为按钮。

  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.cppreturn from event loop

并销毁QMessageBox实例。

据我了解,销毁QMessageBox时,所有按钮也会被销毁,因此它应该触发_q_handleButtonDestroyed处理程序并引起一些奇怪的行为。

我在IDE中设置了一些断点并运行。单击按钮不会进入_q_handleButtonDestroyed。它还不会进入qdialogbuttonbox.cpp的#663#726行中的所有断开连接

我想知道单击按钮时在哪里断开_q_handleButtonDestroyed连接?还是我错了?

谢谢。

0 个答案:

没有答案