从在非 GUI 线程中运行的 C 代码获取 QInputDialog::getText() 结果

Posted

技术标签:

【中文标题】从在非 GUI 线程中运行的 C 代码获取 QInputDialog::getText() 结果【英文标题】:Getting QInputDialog::getText() result from C code running in non-GUI thread 【发布时间】:2011-01-07 01:08:24 【问题描述】:

我之前在this question 中解决了一个类似的问题,在那里我询问了如何在运行 C 代码的 Qt 中从非 GUI 线程显示 QMessageBox。

我被建议的解决方案是,使用信号和插槽以及 Qt::QueuedConnection 来连接可能由 C 代码发出的信号,该 C 代码调用 C++ 函数,然后调用我的主 GUI 窗口的 C++ 方法,然后发出信号,对 QMessageBoxes 工作正常。

但是,现在我还需要能够从运行在非 GUI 线程中的 C 代码中的 QInputDialog 向用户请求输入。

我曾想过使用下面的插槽代码和上面描述的相同原理:

void MyWidget::prompt_slot(QString str, QString &answer)

  answer = QInputDialog::getText(0, "", str);

和一个 Qt::BlockingQueuedConnection,以便插槽修改对字符串的引用,然后我可以从 C 代码中访问该字符串。

不幸的是,我收到以下运行时错误:

QObject::connect: Cannot queue arguments of type 'QString&'
(Make sure 'QString&' is registered using qRegisterMetaType().)

我做错了什么?通过方法甚至会起作用吗?如果没有,我应该使用什么?

非常感谢您的回答。

【问题讨论】:

【参考方案1】:

如果您使用QString* 而不是QString&,它应该可以工作。您可能还必须将 QString* 注册为元类型 - 或者,如果您不介意这样做,请改用 void* 并来回转换。

【讨论】:

嗯,这很简单,使用指针而不是参考就可以了。谢谢!

以上是关于从在非 GUI 线程中运行的 C 代码获取 QInputDialog::getText() 结果的主要内容,如果未能解决你的问题,请参考以下文章

在非 gui 线程中获取文件图标 (QFileIconProvider::icon)

在非 GUI 线程中创建 QWidget

JMeter - 在非 GUI 模式下测试运行时运行 shutdown.cmd 时出错

如何从在 C 中存储 shell 脚本输出的指针获取多个字符串?

如何在非阻塞线程中同步获取单声道对象?

通过 CLI 包装器在非托管 C++ 中使用 C#.NET Winform - 需要线程?