相关疑难解决方法(0)

在PyQt中使用QThread的后台线程

我有一个程序,通过我在PyQt中编写的gui与我正在使用的收音机连接.显然,无线电的一个主要功能是传输数据,但为了不断地这样做,我必须循环写入,这会导致gui挂起.因为我从未处理过线程,所以我试图摆脱这些挂起使用QCoreApplication.processEvents().无线电需要在传输之间休眠,所以gui仍然根据这些睡眠的持续时间而挂起.

有没有一种简单的方法可以使用QThread来解决这个问题?我已经找到了有关如何使用PyQt实现多线程的教程,但是大多数都涉及设置服务器,并且比我需要的更先进.老实说,我甚至不需要我的线程在运行时更新任何东西,我只需要启动它,让它在后台传输,然后停止它.

python multithreading pyqt pyqt4 qthread

68
推荐指数
6
解决办法
10万
查看次数

PyQt5信号和插槽'QObject没有属性'错误

我一直试图找到一种方法来从主外部的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)

user-interface pyqt qt-signals pyqt5

7
推荐指数
1
解决办法
1万
查看次数

从工作线程发出Qt :: signal会默认在主线程上进行UI更新?

我是新来的Qt.我有一个工作线程std::thread.工作线程函数在循环中不断地获取一些数据.经常TextQMLUI 上的元素上更新数据的大小.我有一个监听器回调,它只是一个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::threademit SignalUpdateData这更新QML Text elementUI.

void CallBackReceivedFromWorkerThread(float someValue) {
  emit SignalUpdateData(someValue)
}
Run Code Online (Sandbox Code Playgroud)

以下是我如何将其C++ signalQML slot

QObject::connect(this, SIGNAL(SignalUpdateData(QVariant)), myTextItemQObject, SLOT(slotUpdateData(QVariant)));
Run Code Online (Sandbox Code Playgroud)

所有这一切都很好.没有碰撞,锁定,什么也没有.

根据我的理解,由于工作线程的函数正在触发回调,因此当收到回调时,执行控制在工作线程上.所以在做的时候emit SignalUpdateData(someValue),我们仍然在工作线程上.据我之前在 …

c++ qt multithreading signals-slots qml

1
推荐指数
1
解决办法
1353
查看次数