【问题标题】:Programming a GUI with PyQt in Python3在 Python3 中使用 PyQt 编写 GUI
【发布时间】:2019-07-05 21:50:59
【问题描述】:

我被要求使用 PyQt 创建一个 GUI,而不使用任何 Qtdesigner 来完成我的任务。但现在我面临一个问题。在此图片 GUI 屏幕截图中

如您所见,有一个旋转框“Anzahl der Schicht”。我想要做的是,当用户设置这个 spinbox 的值时,它下面的区域将显示输入的相应行(QLineEdit、QSlider Widget、QLineEdit 和 2 个 QSpinbox 的组合)。

例如,我上传的图片,表示spinbox“Anzahl der Schicht”的值为3,所以它下面有3行。如果值为 4,则应该有 4 行。 spinbox 的价值没有限制。如何为 GUI 制作这种动态效果?

2019 年 7 月 5 日更新 感谢所有有用的回复。以下代码和图片GUI version2 是我目前的状态。到目前为止,我无法将 Qspinbox 连接到类 Widget() 以添加或删除行。所以我只是使用一个按钮“添加小部件”来实现我想要的。

class ExampleWidget(QtWidgets.QGroupBox):
def __init__(self, numAddWidget):
    QtWidgets.QGroupBox.__init__(self)
    self.numAddWidget = numAddWidget
    self.initSubject()
    self.organize()
    self.setFlat(True)
    self.setStyleSheet("border: 1px solid transparent")

def initSubject(self):
    self.shiftname =QtWidgets.QLineEdit() # Eingabefeld init
    self.shiftname.setText('0')
    self.shiftpercent = QtWidgets.QSlider()
    self.shiftpercent.setOrientation(QtCore.Qt.Horizontal)
    self.carnum =QtWidgets.QLineEdit() # Eingabefeld init
    self.carnum.setText('0')
    self.start = QtWidgets.QTimeEdit()
    self.start.setDisplayFormat("HH:mm")
    self.end = QtWidgets.QTimeEdit()
    self.end.setDisplayFormat("HH:mm")        

def organize(self):
    grid = QtWidgets.QGridLayout(self)
    self.setLayout(grid)
    grid.addWidget(self.shiftname, 0,0)
    grid.addWidget(self.shiftpercent, 0,1)
    grid.addWidget(self.carnum, 0,2)
    grid.addWidget(self.start, 0,3)
    grid.addWidget(self.end, 0,4)


class Widget(QtWidgets.QWidget):
def __init__(self):
    super().__init__()
    self.numAddWidget = 1
    self.initUi()

def initUi(self):
    self.layoutV = QtWidgets.QVBoxLayout(self)

    self.area = QtWidgets.QScrollArea(self)
    self.area.setWidgetResizable(True)
    self.scrollAreaWidgetContents = QtWidgets.QWidget()

    self.layoutH = QtWidgets.QHBoxLayout(self.scrollAreaWidgetContents)
    self.gridLayout = QtWidgets.QGridLayout()
    self.layoutH.addLayout(self.gridLayout)

    self.area.setWidget(self.scrollAreaWidgetContents)
    self.add_button = QtWidgets.QPushButton("Add Widget")
    self.layoutV.addWidget(self.add_button)
    self.layoutV.addWidget(self.area)
    self.add_button.clicked.connect(self.addWidget)

    self.widget = ExampleWidget(self.numAddWidget)
    self.gridLayout.addWidget(self.widget)       

def addWidget(self):
    self.numAddWidget += 1
    self.widget = ExampleWidget(self.numAddWidget)
    self.gridLayout.addWidget(self.widget)

if __name__ == '__main__':
app = QtWidgets.QApplication(sys.argv)
w = Widget()
w.show()
sys.exit(app.exec_()) 

【问题讨论】:

  • 展示你的尝试
  • 这听起来像是“可变数量的变量”:stackoverflow.com/questions/1373164/…
  • @S.Nick,@eyllanesc 我刚刚附上了代码。如果您仍然对它感兴趣,请看一下。

标签: python python-3.x user-interface pyqt


【解决方案1】:

这是一种方法。在此示例中,小部件(在本例中为 QLineEdits)存储在列表 Widget.items 中。当旋转框的值发生变化时,额外的小部件将附加到此列表中,并在必要时添加到垂直布局中。然后根据当前可见小部件的数量是大于还是小于旋转框的值来显示或隐藏小部件。

from PyQt5 import QtWidgets

class Widget(QtWidgets.QWidget):
    def __init__(self, *args, **kwargs):
        super().__init__()
        self.resize(500,500)
        self.items = []
        self.item_count = 0
        self.item_factory = QtWidgets.QLineEdit

        group_box = QtWidgets.QGroupBox()
        self.item_layout = QtWidgets.QVBoxLayout(group_box)
        self.item_layout.addStretch(2)

        self.spin_box = QtWidgets.QSpinBox(self)
        self.spin_box.valueChanged.connect(self.set_item_count)

        h_layout = QtWidgets.QHBoxLayout(self)
        h_layout.addWidget(group_box, 2)
        h_layout.addWidget(self.spin_box, 0)


    def set_item_count(self, new_count:int):
        n_items = len(self.items)
        for ii in range(n_items, new_count):
            item = self.item_factory(self)
            self.items.append(item)
            self.item_layout.insertWidget(n_items, item)
        for ii in range(self.item_count, new_count):
            self.item_layout.itemAt(ii).widget().show()
        for ii in range(new_count, self.item_count):
            self.item_layout.itemAt(ii).widget().hide()
        self.item_count = new_count

if __name__ == "__main__":
    app = QtWidgets.QApplication([])
    window = Widget()
    window.show()
    app.exec()

【讨论】:

  • 谢谢@Heike。我从你的代码中提取了一些想法。
猜你喜欢
  • 1970-01-01
  • 2021-06-01
  • 1970-01-01
  • 2017-02-16
  • 2019-04-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多