gpt4 book ai didi

python - 使用 Python GUI (PySide) 元素的 OOP 技术

转载 作者:太空宇宙 更新时间:2023-11-03 16:19:59 25 4
gpt4 key购买 nike

目标:在 PySide 中创建一个订单项对象,其中包含标签、值和值单位的文本框。

背景:我正在为在 Raspberry Pi 上运行的设备创建一个控制面板,使用 Python PySide (QtPython) 来处理 GUI。我正在使用网格布局,并且有一个共同的主题,我试图将其封装在一个类中以避免重复。我需要一些帮助来构建该类。

通常,我的代码如下所示:

class Form(QDialog):
def __init__(self, parent=None):
super(Form, self).__init__(parent)

self.pressure_label = QLabel('Pressure:')
self.pressure_value = QLabel()
self.pressure_units = QLabel('psi')

self.temperature_label = QLabel('Temperature:')
self.temperature_value = QLabel()
self.temperature_units = QLabel('oC')
...

grid = QGridLayout()

grid.addWidget(pressure_label, 0, 0)
grid.addWidget(pressure_value, 0, 1)
grid.addWidget(pressure_units, 0, 1)

grid.addWidget(temperature_label, 1, 0)
grid.addWidget(temperature_value, 1, 1)
grid.addWidget(temperature_units, 1, 1)
...

self.setLayout(grid)

def update(self):
self.temperature_value.setText(t_sensor.read())
self.pressure_value.setText(p_sensor.read())

我尝试过的:

对于 GUI 元素,我不太确定需要将类放在哪里,或者它们需要继承什么父对象。我尝试通过以下方式创建一个对象,但它只是一个框架,显然无法编译。

class LineItem(object):
def __init__(self, label_text, unit_text, grid, row):
self.value = None
self.units = None

self.label_field = QLabel(label_text)
self.value_field = QLabel()
self.units_field = QLabel(unit_text)

grid.addWidget(self.label_field, row, 0)
grid.addWidget(self.value_field, row, 1)
grid.addWidget(self.units_field, row, 2)

@property
def value(self):
return self.value

@value.setter
def value(self, val):
self.value = val
self.value_field.setText(val)

@property
def units(self):
return self.value

@value.setter
def units(self, val):
self.units = val
self.units_field.setText(val)

class Form(QDialog):
def __init__(self, parent=None):
grid = QGridLayout()

row_number = itertools.count()
tb_encoder_1 = LineItem('Distance:', 'm', grid, next(row_number))
tb_encoder_2 = LineItem('Distance:', 'm', grid, next(row_number))

self.setLayout(grid)

我需要什么:

我希望做的是将这个标签、值、单位结构封装到一个类中,这样我就不必重复太多。

这样的类去哪里呢?它继承了什么?我如何授予它访问grid对象的权限(它是否需要访问权限)?

我所努力的是理解类和封装如何转换为 PySide 表单和小部件。到目前为止,我看到的大多数教程都没有走这条路,他们只是将所有逻辑和创建放在一个大 Form(QDialog) 类中。

最佳答案

您只需要一个 QWidget 子类来充当其他小部件的容器。它的结构将与普通表单非常相似 - 主要区别在于它将最终作为另一个表单的子窗口小部件,而不是作为顶级窗口。

class LineItem(QWidget):
def __init__(self, label_text, unit_text, parent=None):
super(LineItem, self).__init__(parent)

self.label_field = QLabel(label_text)
self.value_field = QLabel()
self.units_field = QLabel(unit_text)

layout = QVBoxLayout()
layout.setContentsMargins(0, 0, 0, 0)

layout.addWidget(self.label_field)
layout.addWidget(self.value_field)
layout.addWidget(self.units_field)

self.setLayout(layout)

class Form(QDialog):
def __init__(self, parent=None):
super(Form, self).__init__(parent)

self.pressure_line = LineItem('Pressure:', 'psi', self)
self.temperature_line = LineItem('Temperature:', 'oC', self)

layout = QHBoxLayout()

layout.addWidget(self.pressure_line)
layout.addWidget(self.temperature_line)

self.setLayout(layout)

关于python - 使用 Python GUI (PySide) 元素的 OOP 技术,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38574025/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com