如何获得QDialog :: show()的结果?

时间:2015-07-08 13:37:26

标签: qt exec show

我想在我的项目中将sed -nr 's#database_([^"]*)="([^"]*)"#s/%[^%]*\1%/\2/#p' file | sed -r -f- file 用法转换为exec方法。因为,当我使用show用于Windows(对话框)时,我无法打开另一个窗口。这是execexec()方法之间的基本区别。

show()exec以不同的方式工作,我想知道如何使用show代替show()更改以下代码。

例如:

exec()

3 个答案:

答案 0 :(得分:4)

show()显示非模态窗口;

exec()显示模态窗口。

如果你想获得show()的结果,那么请使用Q​​t信号/插槽:

ExampleWindow::ExampleWindow(QWidget *parent) : QDialog(parent)
{
    // Assuming the QDialogButtonBox name is "buttonBox":
    connect(buttonBox, SIGNAL(accepted()), this, SLOT(accept()));
    connect(buttonBox, SIGNAL(rejected()), this, SLOT(reject()));
}

<强> MainWindow.h

class MainWindow : public QMainWindow {
    Q_OBJECT
private slots:
    void updateData();
}

<强> MainWindow.cpp

MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent)
{
    connect(exampleWindow, SIGNAL(accepted()), this, SLOT(updateData()));
}

void MainWindow::updateData()
{
    // Your code:
    exampleWindow->UpdateCalibrationData(&data);
    exampleWindow->UpdateFilterData(&filterData);
    exampleWindow();
}

答案 1 :(得分:1)

show()只是使对话框窗口可见。这是QWidget方法。

exec(),在类中提供时,始终会旋转事件循环。如果是特定的对话框,它会在旋转事件循环之前使对话框可见。

您可以自己实现功能相同的exec(),如下所示:

void myExec(QDialog * dialog) {
  QStateMachine sm;
  QState s1(&sm), s2(&sm);
  sm.setInitialState(&s1);
  QEventTransition transition(dialog, QEvent::Close);
  s2.addTransition(&transition);
  QEventLoop loop;
  QObject::connect(&s2, &QState::entered, &loop, &QEventLoop::quit);
  sm.start();
  dialog->show();
  loop.exec();
}

一般来说,您永远不应该使用exec()来创建嵌套的事件循环,因为您要将大量自己的代码暴露给可能的重入要求。如果是对话框,总是可以在不使用exec()的情况下显示模态对话框,所以它真的没有意义。

答案 2 :(得分:0)

exec()方法显示描述为here

的模态对话框

您可以使用对话框的closeEvent()。在其中你可以写出类似的东西:

void ExmpleWin::closeEvent(QCloseEvent *event)
{
    if (/*Your condition*/) {
        emit signalUpdateMyData();
        event->accept();
    }
}

此外,您必须将信号signalUpdateMyData()与适当的插槽连接,您可以在其中进行:

exampleWindow->UpdateCalibrationData(&data);
exampleWindow->UpdateFilterData(&filterData);
exampleWindow();