以非阻塞方式打开 QDialog

Posted

技术标签:

【中文标题】以非阻塞方式打开 QDialog【英文标题】:Opening QDialog in a non-blocking manner 【发布时间】: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。 【参考方案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);

【讨论】:

以上是关于以非阻塞方式打开 QDialog的主要内容,如果未能解决你的问题,请参考以下文章

以非阻塞方式等待 CIContext 渲染任务

使用 Matplotlib 以非阻塞方式绘图

如何以非阻塞方式压缩文件

Spring如何以非阻塞方式匹配bcrypt密码

无法在 docker 容器内以非阻塞方式读取类路径资源文件

如何以非阻塞方式链接期货?也就是说,如何在不阻塞的情况下将一个future用作另一个future的输入?