我想在我的项目中将sed -nr 's#database_([^"]*)="([^"]*)"#s/%[^%]*\1%/\2/#p' file | sed -r -f- file
用法转换为exec
方法。因为,当我使用show
用于Windows(对话框)时,我无法打开另一个窗口。这是exec
和exec()
方法之间的基本区别。
show()
和exec
以不同的方式工作,我想知道如何使用show
代替show()
更改以下代码。
例如:
exec()
答案 0 :(得分:4)
show()
显示非模态窗口;
exec()
显示模态窗口。
如果你想获得show()
的结果,那么请使用Qt信号/插槽:
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();