首页 > 解决方案 > 如何在 PyQt5 中从一个类访问 Qobject 到另一个类

问题描述

我正在导入interface.ui我的应用程序,它有一个QcomboBox对象。我使用一个QThread类来运行一个循环。我想知道如何从另一个类访问我的组合框(QThread

class Ui(QtWidgets.QMainWindow):
    def __init__(self):
        super(Ui, self).__init__()
        uic.loadUi('interface.ui', self)
        self.show()
        # self.comboBox is what I want to access

class WorkerThread(QThread):
        def run(self):
          #The other class and I want to access it here

我想self.comboBox从 UI 类访问到WorkerThread类。我如何从一个班级访问他们到另一个班级?

这是我想要实现的目标:

我的应用程序中有一些QTextEdit对象。当用户在此文本编辑框中输入一些信息时,单击按钮会将它们转储到名为 .json 的 json 文件data.json中。但是,如果用户选择了不同的组合框选项,我希望程序打开一个不同的 json 文件并将它们转储到该 json 文件中。我有这个工作。

由于我已将数据存储在data.json默认组合框选项的文件中,因此我打开data.json以运行我的线程。(我的线程使用 json 文件中的信息)。

如果用户选择了不同的组合框选项,我希望程序以所选组合框选项的 currentText 的名称打开特定的 json 文件,并从中获取信息并运行我的线程。

class WorkerThread(QThread):
      def run(self):
          # if currentText of comboBox == 'default':
           with open('data.json') as f:
                 data = json.load(f)
          # else:
           with open(f'{currentText of comboBox}.json') as f:
                 data = json.load(f)

根据所选组合框选项的文本打开正确的 json 文件后,我开始循环。

class WorkerThread(QThread):
      def run(self):
          # if currentText of comboBox == 'default':
           with open('data.json') as f:
                 data = json.load(f)
          # else:
           with open(f'{currentText of comboBox}.json') as f:
                 data = json.load(f)

           while True:
               print(data['my_data_of_the_opened_json'])

标签: pythonjsonpyqt5

解决方案


外部线程应始终与主 UI 线程分开工作。事实上,理论上它应该对 UI完全一无所知。

如果用户选择了不同的组合框选项,我希望程序以所选组合框选项的 currentText 的名称打开特定的 json 文件,并从中获取信息并运行我的线程。

您的解释已经有了答案:选择组合选项后运行线程。这意味着它应该只在那时创建(或启动),而不是之前。

拿这个伪代码:

class Worker(QThread):
    def __init__(self, options):
        super().__init__()
        self.options = options

    def run(self):
        # do something with given options


class MainWindow(QMainWindow):
    def __init__(self):
        # ...
        self.comboBox.activated.connect(self.startThread)

    def startThread(self, index):
        options = self.readFromJson(...)
        self.worker = Worker(options)
        self.worker.start()

在某些情况下,线程应该是持久的,所以它被创建提早启动,然后它会等到实际需要一些处理;在这些情况下,您可以使用队列并等待一些数据。

from queue import Queue

class Worker(QThread):
    def __init__(self):
        super().__init__()
        self.queue = Queue()

    def run(self):
        while True:
            options = self.queue.get()
            # do something with options

    def queueOptions(self, options):
        self.queue.put(options)


class MainWindow(QMainWindow):
    def __init__(self):
        # ...
        self.comboBox.activated.connect(self.processOption)
        self.worker = Worker()
        self.worker.start()

    def processOption(self, index):
        options = self.readFromJson(...)
        self.worker.queueOptions(options)

推荐阅读