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

时间:2016-07-25 17:29:24

标签: python python-2.7 class pyside encapsulation

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

后台:我正在为使用Python PySide(QtPython)处理GUI的Raspberry Pi运行的设备创建一个控制面板。我正在使用网格布局,并且有一个共同的主题,我试图封装在一个类中,以避免重复自己。我需要帮助建立这门课程。

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

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)类中。

1 个答案:

答案 0 :(得分:1)

您只需要一个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)