如何在exec()上隐藏QDialog(不显示GUI)

时间:2014-08-08 02:03:14

标签: qt

我想exec()没有GUI的QDialog用于我的测试 - 不需要显示GUI。

在主窗口中,当我执行一个QDialog时,它显示了它的GUI窗口。我将QDialog中的线程信号连接到QDialog中的一个插槽,因此需要QDialog.exec()。 QDialog.hide()无效。

有没有解决方案?

1 个答案:

答案 0 :(得分:1)

你永远不应该exec()对话。这可能会导致微妙的错误,因为exec()调用可以重新输入您不打算重新输入的代码。

如果您真的坚持使用exec(),那么简单的解决方案是将CloseEvent发布到对话框中。一旦对话框的事件循环开始运行,将处理该事件。

MyDialog dialog;
QCoreApplication::postEvent(&dialog, new QCloseEvent());
dialog.exec();

此代码在功能上等同于以下内容:

MyDialog dialog;
QMetaObject::invokeMethod(&dialog, "close", Qt::QueuedConnection);
dialog.exec();

另一种更安全的方法是不使用exec。只需将对话框的accepted()rejected()信号连接到代码中的插槽 - 毕竟,对话框的接受或拒绝是异步发生的。

然后很简单,不要在测试代码路径中show()对话框。您还可以通过调用acceptreject个插槽轻松模拟正在接受或拒绝的对话框。

我真的不明白你是如何联系"从线程到对话框插槽的信号,等等。您可以随意将下面的示例粘贴到您的问题中,修改它以执行线索" stuff",并展示它是如何工作的。它还有助于了解您如何实施测试工具。

以下示例只是一个文件,如果您在制作说明问题的测试用例时保持这种情况,它会有所帮助。

// main.cpp
#include <QApplication>
#include <QDialog>
#include <QLabel>
#include <QGridLayout>
#include <QPushButton>
#include <QDialogButtonBox>

class MyDialog : public QDialog {
   QGridLayout m_layout;
   QDialogButtonBox m_box;
public:
   MyDialog(QWidget * parent = 0) : QDialog(parent), m_layout(this),
      m_box(QDialogButtonBox::Ok | QDialogButtonBox::Cancel)
   {
      m_layout.addWidget(&m_box);
      connect(&m_box, SIGNAL(accepted()), SLOT(accept()));
      connect(&m_box, SIGNAL(rejected()), SLOT(reject()));
   }
};

class MyGui : public QWidget {
   Q_OBJECT
   QGridLayout m_layout;
   QLabel m_label;
   QPushButton m_button;
   MyDialog m_dialog;
   Q_SLOT void on_button_clicked() {
      m_dialog.show();
   }
   Q_SLOT void on_dialog_accepted() {
      m_label.setText("The dialog was accepted");
   }
   Q_SLOT void on_dialog_rejected() {
      m_label.setText("The dialog was rejected");
   }
public:
   MyGui() : m_layout(this), m_button("Show Dialog"), m_dialog(this) {
      m_button.setObjectName("button");
      m_dialog.setObjectName("dialog");
      m_layout.addWidget(&m_label);
      m_layout.addWidget(&m_button);
      QMetaObject::connectSlotsByName(this);
   }
};

int main(int argc, char *argv[])
{
   QApplication app(argc, argv);
   MyGui gui;
   gui.show();
   return app.exec();
}

#include "main.moc"