我想exec()没有GUI的QDialog用于我的测试 - 不需要显示GUI。
在主窗口中,当我执行一个QDialog时,它显示了它的GUI窗口。我将QDialog中的线程信号连接到QDialog中的一个插槽,因此需要QDialog.exec()。 QDialog.hide()无效。
有没有解决方案?
答案 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()
对话框。您还可以通过调用accept
或reject
个插槽轻松模拟正在接受或拒绝的对话框。
我真的不明白你是如何联系"从线程到对话框插槽的信号,等等。您可以随意将下面的示例粘贴到您的问题中,修改它以执行线索" 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"