具有 Python 个 GUI (PySide) 元素的 OOP 技术
OOP techniques with Python GUI (PySide) elements
Objective: 在 PySide 中创建一个包含标签、值和值单位的文本框的行项目对象。
背景: 我正在使用 Python PySide(Qt Python) 来处理 GUI。我正在使用网格布局,并且有一个共同的主题,我试图将其封装在 class 中以避免重复自己。我需要一些帮助来构建 class.
通常,我的代码如下所示:
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 元素,我不太确定我需要将我的 classes 放在哪里,或者它们需要继承什么父对象。我试过用下面的方法创建一个对象,但是它只是一个框架,显然编译不通过。
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)
我需要的:
我希望做的就是把这个label,value,units结构封装成一个class,这样我就不用那么多重复了。
这样的class去哪儿了?它继承了什么?我如何授予它访问 grid
对象的权限(它甚至需要访问权限)?
我努力解决的问题是理解 classes 和封装如何转化为 PySide 表单和小部件。到目前为止我看到的大多数教程都没有走那条路,他们只是把所有的逻辑和创建放在一个大 Form(QDialog)
class.
您只需要一个 QWidget
子类作为其他小部件的容器。它的结构将与普通表单非常相似——主要区别在于它将作为另一种表单的子窗口小部件结束,而不是作为顶级 window.
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)
Objective: 在 PySide 中创建一个包含标签、值和值单位的文本框的行项目对象。
背景: 我正在使用 Python PySide(Qt Python) 来处理 GUI。我正在使用网格布局,并且有一个共同的主题,我试图将其封装在 class 中以避免重复自己。我需要一些帮助来构建 class.
通常,我的代码如下所示:
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 元素,我不太确定我需要将我的 classes 放在哪里,或者它们需要继承什么父对象。我试过用下面的方法创建一个对象,但是它只是一个框架,显然编译不通过。
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)
我需要的:
我希望做的就是把这个label,value,units结构封装成一个class,这样我就不用那么多重复了。
这样的class去哪儿了?它继承了什么?我如何授予它访问 grid
对象的权限(它甚至需要访问权限)?
我努力解决的问题是理解 classes 和封装如何转化为 PySide 表单和小部件。到目前为止我看到的大多数教程都没有走那条路,他们只是把所有的逻辑和创建放在一个大 Form(QDialog)
class.
您只需要一个 QWidget
子类作为其他小部件的容器。它的结构将与普通表单非常相似——主要区别在于它将作为另一种表单的子窗口小部件结束,而不是作为顶级 window.
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)