jan*_*jan 2 pyqt qthread qtimer
我试图通过将一些阻塞代码移动到单独的 QThread 来使我的 PyQt4 程序响应更快。由于它不起作用,我创建了这个最小的示例作为演示:
import sys
import time
from PyQt4 import QtCore, QtGui
class Sleeper(QtCore.QObject):
def __init__(self):
super(Sleeper, self).__init__()
self.timer = QtCore.QTimer()
self.timer.timeout.connect(self.sleep)
self.timer.start(1000)
def sleep(self):
time.sleep(1)
class MyGUI(QtGui.QMainWindow):
def __init__(self, parent=None):
super(MyGUI, self).__init__(parent)
self.button = QtGui.QPushButton("hello", self)
self.sleeper = Sleeper()
self.thread = QtCore.QThread()
self.sleeper.moveToThread(self.thread)
self.thread.start()
if __name__ == "__main__":
qapp = QtGui.QApplication(sys.argv)
my_gui = MyGUI()
my_gui.show()
qapp.exec_()
Run Code Online (Sandbox Code Playgroud)
这段代码的问题是 sleep 命令仍然阻塞用户界面。我发现当我在 Sleeper 类之外创建、连接和运行 QTimer 时,它按预期工作,但我不明白为什么。
当connect对象位于 GUI 线程中时调用,因此事件处理程序也将在 GUI 线程中执行。尝试先移动到线程,然后创建连接。
class Sleeper(QtCore.QObject):
def __init__(self):
super(Sleeper, self).__init__()
self.timer = QtCore.QTimer()
def initialize(self): # Creating the connection and starting separately
self.timer.timeout.connect(self.sleep)
self.timer.start(1000)
def sleep(self):
time.sleep(1)
class MyGUI(QtGui.QMainWindow):
def __init__(self, parent=None):
super(MyGUI, self).__init__(parent)
self.button = QtGui.QPushButton("hello", self)
self.sleeper = Sleeper()
self.thread = QtCore.QThread()
self.sleeper.moveToThread(self.thread) # Move to thread
self.sleeper.initialize() # Create connection now
self.thread.start()
Run Code Online (Sandbox Code Playgroud)
另外,检查一下: 线程之间的 Qt 连接类型:为什么这有效?
| 归档时间: |
|
| 查看次数: |
1178 次 |
| 最近记录: |