将事件循环置于睡眠状态,直到下一个事件到达

时间:2016-07-09 10:04:32

标签: qt swt

我需要将一些java SWT代码移植到Qt:

Shell shell;
while ((shell = getStatusDialogShell()) != null
                && !shell.isDisposed()) {
    if (!shell.getDisplay().readAndDispatch()) {
                Display.getDefault().sleep();
    }
}

调用Display.getDefault().sleep();将事件循环置于睡眠状态,直到下一个事件到达为止 我遇到的问题是我无法在Qt中找到如何模拟这个问题。看起来没有相当于将Qt事件循环置于睡眠状态直到下一个事件到来。有什么想法吗?

2 个答案:

答案 0 :(得分:1)

使用QEventLoop :: WaitForMoreEvents的QEventLoop::ProcessEventsFlags是否解决了你的问题或两者的组合?

答案 1 :(得分:1)

您的代码在Qt中是非惯用的,尽管它有直接翻译:

void MyClass::mySlot() {
  MyDialog dialog;
  ...
  if (dialog.exec() == QDialog::Accepted) {
    // code to run on dialog's acceptance
  }
}

这是非惯用的,因为您重新进入事件循环,这可能会在设计其余代码时产生各种问题,也会在运行时产生。

然后,最好显示一个对话框,返回主事件循环,然后让它处理对话框:

void MyClass::mySlot() {
  auto dialog = new MyDialog{parent};
  dialog->setAttribute(Qt::WA_DeleteOnClose);
  connect(dialog, &QDialog::accepted, this, [this]{
    // code to run on dialog's acceptance
  };
  dialog->show();
}