我有一个程序,通过我在PyQt中编写的gui与我正在使用的收音机连接.显然,无线电的一个主要功能是传输数据,但为了不断地这样做,我必须循环写入,这会导致gui挂起.因为我从未处理过线程,所以我试图摆脱这些挂起使用QCoreApplication.processEvents().无线电需要在传输之间休眠,所以gui仍然根据这些睡眠的持续时间而挂起.
有没有一种简单的方法可以使用QThread来解决这个问题?我已经找到了有关如何使用PyQt实现多线程的教程,但是大多数都涉及设置服务器,并且比我需要的更先进.老实说,我甚至不需要我的线程在运行时更新任何东西,我只需要启动它,让它在后台传输,然后停止它.
我一直试图找到一种方法来从主外部的Python线程更新GUI线程.sourceforge上的PyQt5文档有关于如何执行此操作的良好说明.但我仍然无法让事情发挥作用.
有没有一种很好的方法来解释交互式会话的以下输出?不应该有办法在这些对象上调用emit方法吗?
>>> from PyQt5.QtCore import QObject, pyqtSignal
>>> obj = QObject()
>>> sig = pyqtSignal()
>>> obj.emit(sig)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
AttributeError: 'QObject' object has no attribute 'emit'
Run Code Online (Sandbox Code Playgroud)
和
>>> obj.sig.emit()
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
AttributeError: 'QObject' object has no attribute 'sig'
Run Code Online (Sandbox Code Playgroud)
和
>>> obj.sig = pyqtSignal()
>>> obj.sig.emit()
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
AttributeError: 'PyQt5.QtCore.pyqtSignal' object …Run Code Online (Sandbox Code Playgroud) 我是新来的Qt.我有一个工作线程std::thread.工作线程函数在循环中不断地获取一些数据.经常Text在QMLUI 上的元素上更新数据的大小.我有一个监听器回调,它只是一个std::function,它从它被调用thread's function.它向我发送了基于我更新Text元素的回调QML.我用signal slot机制更新它.
以下是QML : Text元素:
Text {
id: mytext
objectName: "mytextobject"
function slotUpdateData(someValue){
mytext = someValue
}
}
Run Code Online (Sandbox Code Playgroud)
SignalUpdateData与连接slotUpdateData其驻留在QML侧.每当我得到的数据事件回调从std::thread我emit SignalUpdateData这更新QML Text element上UI.
void CallBackReceivedFromWorkerThread(float someValue) {
emit SignalUpdateData(someValue)
}
Run Code Online (Sandbox Code Playgroud)
以下是我如何将其C++ signal与QML slot
QObject::connect(this, SIGNAL(SignalUpdateData(QVariant)), myTextItemQObject, SLOT(slotUpdateData(QVariant)));
Run Code Online (Sandbox Code Playgroud)
所有这一切都很好.没有碰撞,锁定,什么也没有.
根据我的理解,由于工作线程的函数正在触发回调,因此当收到回调时,执行控制在工作线程上.所以在做的时候emit SignalUpdateData(someValue),我们仍然在工作线程上.据我之前在 …