如何从主类与我的小部件通信 QThread

huangapple go评论45阅读模式
英文:

How to communicate QThread with my Widgets from main class

问题

以下是您提供的代码的翻译部分:

我的应用程序因需要创建一个新的QThread而冻结但我有点困惑如何在调用存在于主类上的小部件时创建它

以下是迄今为止的我的代码...

从PyQt5导入QtCoreQtGuiQtWidgets
从PyQt5.uic导入loadUi
import时间

##主类
class HWindow(QtWidgets.QWidget):

    def __init__(self):
        super(HWindow, self).__init__()
        loadUi("Hw.ui", self)  # 加载UI

        # 创建一个QThread对象
        self.thread = QtCore.QThread()
        # 创建一个QThread对象
        self.workerMain = WorkerMain()
        # 将工作线程移到线程中
        self.workerMain.moveToThread(self.thread)
        # 启动线程
        self.thread.start()
        self.runningMain = False

    def activateMain(self):
        if self.chkb_main.isChecked():
            self.lbl_disena_main.setText("已激活")
            self.lbl_disena_main.setStyleSheet('color: green;')
            # 更改变量并调用函数
            runningMain = True
            self.myFunction()
        else:
            self.lbl_disena_main.setText("已禁用")
            self.lbl_disena_main.setStyleSheet('color: red;')
            # 更改变量并调用函数
            runningMain = False

    def myFunction(self):
        while self.runningMain == True:
            if self.gpb_main.isChecked() and self.chkb_main.isChecked():
                print("运行中...")
                time.sleep(3)

##工作线程类
class WorkerMain(QtCore.QObject):
    threadRunning = QtCore.pyqtSignal()

    def __init__(self):
        super(WorkerMain, self).__init__()

    def run(self):
        print("线程运行中...")

        # 从这里无法调用来自主类的小部件。
        '''
        while self.runningMain == True:
            if self.gpb_main.isChecked() and self.chkb_main.isChecked():
                print("运行中...")
                time.sleep(3)
        '''

    def stop(self):
        print("线程已停止...")
        self.terminate()

if __name__ == "__main__":
    import sys
    app = QtWidgets.QApplication(sys.argv)
    hWindow = QtWidgets.QWidget()
    hWindow = HWindow()
    hWindow.show()
    sys.exit(app.exec_())

请注意,我将代码中的双引号(")替换为单引号(')以使其成为有效的Python代码。此外,您提到您在工作线程中无法从主类中调用小部件,这是因为工作线程不直接访问主线程的小部件。您可能需要通过信号和槽机制来实现与主线程小部件的通信。如果您需要进一步的帮助,请提供更多具体信息。

英文:

My app is freezing because i need to create a new QThread, but am a little confused how to create it when i call widgets that exists on the main class.

here is my code so far ...

from PyQt5 import QtCore, QtGui, QtWidgets
from PyQt5.uic import loadUi
import time
##Main Class
class HWindow(QtWidgets.QWidget):
def __init__(self):
super(HWindow, self).__init__()
loadUi("Hw.ui",self) ##load ui
#Create a QThread object
self.thread = QtCore.QThread()
#Create a QThread object
self.workerMain = WorkerMain()
#Move worker to the thread
self.workerMain.moveToThread(self.thread)
#Start the thread
self.thread.start()
self.runningMain = False
def activateMain(self):
if self.chkb_main.isChecked():
self.lbl_disena_main.setText("Activated")
self.lbl_disena_main.setStyleSheet('color: green;')
#Change variable and call the function
runningMain = True 
self.myFunction()            
else:
self.lbl_disena_main.setText("Disabled")
self.lbl_disena_main.setStyleSheet('color: red;')
#Change variable and call the function
runningMain = False 
def myFunction(self):
while self.runningMain == True:
if self.gpb_main.isChecked() and self.chkb_main.isChecked():
print("running ...")
time.sleep(3)
##Worker Class
class WorkerMain(QtCore.QObject):
threadRunning = QtCore.pyqtSignal()
def __init__(self):
super(WorkerMain, self).__init__()
def run(self):
print("Thread Running ...")
#i cant call my widgets from my main class from here.
'''
while self.runningMain == True:
if self.gpb_main.isChecked() and self.chkb_main.isChecked():
print("running ...")
time.sleep(3)
'''
def stop(self):
print("Thread Stopped ...")
self.terminate()
if __name__ == "__main__":
import sys
app = QtWidgets.QApplication(sys.argv)
hWindow = QtWidgets.QWidget()
hWindow = HWindow()  
hWindow.show()
sys.exit(app.exec_())

Based on pyqt5 documentation and examples, you create a loop on the run method, but it is complicated when i have to create that loop based on what the user select (GUI widgets).

答案1

得分: 0

这是你的代码,我已经帮你翻译了代码部分,如下所示:

我只是搞清楚了这是我的代码...

class HWindow(QtWidgets.QWidget):
    
    def __init__(self):
        super(HWindow, self).__init__()
        loadUi("Hw.ui", self)  # 加载UI文件

        # 创建一个QThread对象
        self.thread = QtCore.QThread()
        # 创建一个QThread对象
        self.workerMain = WorkerMain(self)
        # 将worker移到线程中
        self.workerMain.moveToThread(self.thread)
        # 将启动信号连接到运行槽
        self.workerMain.threadRunning.connect(self.workerMain.run)
        # 将activateMain信号连接到启动槽
        self.chkb_main.toggled.connect(self.activateMain)
        # 启动线程
        self.thread.start()


    def activateMain(self):
        if self.chkb_main.isChecked():
            self.lbl_disena_main.setText("已激活")
            self.lbl_disena_main.setStyleSheet('color: green;')
            self.workerMain.runningMain = True
            self.workerMain.threadRunning.emit()
            if not self.thread.isRunning():
                self.thread.start()
        else:
            self.lbl_disena_main.setText("已禁用")
            self.lbl_disena_main.setStyleSheet('color: red;')
            self.workerMain.runningMain = False
            self.workerMain.stop()

##Worker类
class WorkerMain(QtCore.QObject):
    threadRunning = QtCore.pyqtSignal()
    def __init__(self, parent):
        super(WorkerMain, self).__init__()
        self.parent = parent
        self.runningMain = False

    def run(self):
        print("线程正在运行...")
        while self.runningMain:
            if self.parent.gpb_main.isChecked() and self.parent.chkb_main.isChecked():
                print("运行中...")
                time.sleep(3)

    def stop(self):
        print("线程已停止...")
        if self.parent.thread.isRunning():
            self.parent.thread.quit()
            self.parent.thread.wait()

if __name__ == "__main__":
    import sys
    app = QtWidgets.QApplication(sys.argv)
    hWindow = QtWidgets.QWidget()
    hWindow = HWindow()  
    hWindow.show()
    sys.exit(app.exec_())

请注意,我已将代码中的HTML实体转义字符(例如")翻译为普通文本,以使代码更易阅读。

英文:

i just figure it out, here is my code ...

class HWindow(QtWidgets.QWidget):
def __init__(self):
super(HWindow, self).__init__()
loadUi("Hw.ui",self) ##load ui
#Create a QThread object
self.thread = QtCore.QThread()
#Create a QThread object
self.workerMain = WorkerMain(self)
#Move worker to the thread
self.workerMain.moveToThread(self.thread)
#Connect the start signal to the run slot
self.workerMain.threadRunning.connect(self.workerMain.run)
#Connect the activateMain signal to the start slot
self.chkb_main.toggled.connect(self.activateMain)
#Start the thread
self.thread.start()
def activateMain(self):
if self.chkb_main.isChecked():
self.lbl_disena_main.setText("Activated")
self.lbl_disena_main.setStyleSheet('color: green;')
self.workerMain.runningMain = True
self.workerMain.threadRunning.emit()
if not self.thread.isRunning():
self.thread.start()          
else:
self.lbl_disena_main.setText("Disabled")
self.lbl_disena_main.setStyleSheet('color: red;')
self.workerMain.runningMain = False
self.workerMain.stop()
##Worker Class
class WorkerMain(QtCore.QObject):
threadRunning = QtCore.pyqtSignal()
def __init__(self, parent):
super(WorkerMain, self).__init__()
self.parent = parent
self.runningMain = False
def run(self):
print("Thread Running ...")
while self.runningMain:
if self.parent.gpb_main.isChecked() and self.parent.chkb_main.isChecked():
print("running ...")
time.sleep(3)
def stop(self):
print("Thread Stopped ...")
if self.parent.thread.isRunning():
self.parent.thread.quit()
self.parent.thread.wait()
if __name__ == "__main__":
import sys
app = QtWidgets.QApplication(sys.argv)
hWindow = QtWidgets.QWidget()
hWindow = HWindow()  
hWindow.show()
sys.exit(app.exec_())

huangapple
  • 本文由 发表于 2023年2月6日 17:00:49
  • 转载请务必保留本文链接:https://go.coder-hub.com/75359204.html
匿名

发表评论

匿名网友

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定