所以我使用 QT Designer 创建了一个 GUI。它工作得很好,但在更复杂的调用中,它不会更新主窗口并锁定。我想运行我的CustomComplexFunction()
在根据不断变化的后端信息更新主窗口中的文本编辑时,我希望它每 2 秒运行一次。以下代码看起来正确并且运行没有错误,但不会更新文本编辑。请注意,我正在导入一个从 QT Designer 设计的带有按钮和文本编辑的 .ui 文件,如果没有它,代码将无法运行。
Main.py
import sys
from PyQt5.QtWidgets import QDialog, QApplication, QPushButton, QVBoxLayout, QMainWindow
from PyQt5.QtCore import QCoreApplication, QObject, QRunnable, QThread, QThreadPool, pyqtSignal, pyqtSlot
from PyQt5 import uic, QtGui
class Worker(QObject):
newParams = pyqtSignal()
@pyqtSlot()
def paramUp(self):
x=1
for x in range(100):
time.sleep(2)
self.newParams.emit()
print ("sent new params")
x +=1
Ui_somewindow, _ = uic.loadUiType("mainwindow.ui") #the path to UI
class SomeWindow(QMainWindow, Ui_somewindow, QDialog):
def __init__(self):
QMainWindow.__init__(self)
Ui_somewindow.__init__(self)
self.setupUi(self)
# Start custom functions
self.params = {}
self.pushButton.clicked.connect(self.complex) #NumEvent
def complex(self):
self.work = Worker()
self.thread = QThread()
self.work.newParams.connect(self.changeTextEdit)
self.work.moveToThread(self.thread)
self.thread.start()
self.CustomComplexFunction()
def CustomComplexFunction(self):
self.params['City'] = 'Test'
def changeTextEdit(self):
try:
City = self.params['City']
self.textEdit_14.setPlainText(City)
except KeyError:
City = None
if __name__ == "__main__":
app = QApplication(sys.argv)
window = SomeWindow()
window.show()
sys.exit(app.exec_())
您可以查看官方文档信号和槽在这里 http://pyqt.sourceforge.net/Docs/PyQt5/signals_slots.html和这个SO post https://stackoverflow.com/questions/6783194/background-thread-with-qthread-in-pyqt也非常有帮助,但看起来我构建它是正确的。根据文档,发射器并不关心信号是否被使用。这可能就是代码没有错误但也不起作用的原因。
关于如何使其发挥作用有什么想法吗?或者至少有某种方法来测试发射器和信号?