从在非 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)
JMeter - 在非 GUI 模式下测试运行时运行 shutdown.cmd 时出错