【问题标题】:Opening QDialog in a non-blocking manner以非阻塞方式打开 QDialog
【发布时间】:2011-02-11 23:14:28
【问题描述】:

我有一个像这样打开的 QDialog:

void MyModule::openDialog() {
    this->dialog->open();
    printf("Hello World");
}

对话框打开得很好,但不幸的是,调用 openDialog() 时没有打印“Hello World” - 即使在关闭对话框之后也是如此。但是,当我之后打开另一个完全不相关的文件对话框时,会打印出消息。

是什么导致对话框阻塞,直到打开另一个对话框?当我使用this->dialog->exec();this->dialog->show(); 时,也会发生同样的事情。

可能值得注意的是MyModule::openDialog() 是一个连接到按钮点击事件的槽。

有什么想法吗?

【问题讨论】:

  • QTDialog 还是你的意思是QDialog
  • 我对Qt一无所知,但请确保您将第一个对话框显示为模式对话框。模态对话框将阻止执行,直到对话框被关闭。
  • @doc:是的,你是对的。我的意思是 QDialog。

标签: c++ qt qdialog qt-events


【解决方案1】:

这取决于操作系统,但通常 printf() 不能很好地与 GUI 配合使用。

例如在 windows 上什么都不会出现,在 unix 上你可以执行 fprintf(stdout, ) 然后 fflush(stdout) 或 fprintf(stderr, ) 没有缓冲

如果这只是一个调试功能,请看一下 qDebug() - 就是它的用途。

【讨论】:

  • printf() 可以在 GUI 上正常工作,即使在 Windows 下也是如此……但如果你想在 Windows 下实际看到 stdout 输出,你必须执行 AllocConsole(); freopen("conout$", w, 标准输出);在 main() 的顶部。然后程序运行时会出现一个包含您的输出的控制台窗口。
  • @Jeremy - 这几乎是我对“打得不好”的定义
【解决方案2】:

stdout 被缓冲。调用printf("Hello world"); 将不会输出任何内容,直到输出缓冲区已满或(有时)打印换行符。尝试改用printf("Hello World\n");printf("Hello World\n"); fflush(stdout);

【讨论】:

    猜你喜欢
    • 2013-10-29
    • 1970-01-01
    • 1970-01-01
    • 2014-11-01
    • 2015-03-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-11-12
    相关资源
    最近更新 更多