python - 如何在 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'])
解决方案
外部线程应始终与主 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)
推荐阅读
- python - 模块“pip._internal.download”没有属性“is_file_url”
- python - 如何在 Python html 和烧瓶中显示文件夹中的图像
- python - 看似等效的列表初始化导致不同的行为
- android - 如何在android中制作视图
- c++ - C++ 运算符重载 >>
- c - 更改虚拟页面权限
- c# - 使用动态和静态键的混合反序列化 JSON
- fortran - 如何使用OO Fortran获得五个数字中最小的数字
- arrays - JSON-LD 缺少“}”或对象成员名称。语法错误:需要值、对象或数组。如何解决这个问题
- flutter - Aqueduct 不响应 Flutter 获取请求