以非阻塞方式打开 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的主要内容,如果未能解决你的问题,请参考以下文章