Программирование GUI с PyQt на Python3 - PullRequest
0 голосов
/ 01 июля 2019

Меня попросили создать графический интерфейс с PyQt без использования Qtdesigner для моего задания.Но сейчас я столкнулся с проблемой.На этом снимке экрана с графическим интерфейсом пользователя

, как вы можете видеть, есть спинбокс "Anzahl der Schicht".То, что я хочу сделать, это когда пользователь устанавливает значение для этого спинбокса, в области под ним будут отображаться соответствующие строки ввода (комбинация QLineEdit, QSlider Widget, QLineEdit и 2 QSpinboxes в строке).

Например, фотография, которую я загрузил, означает, что значение spinbox "Anzahl der Schicht" равно 3, поэтому под ним 3 строки.Если значение равно 4, должно быть 4 строки.Существует не ограниченное значение для Spinbox.Как я могу сделать такой динамический эффект для графического интерфейса?

Обновление от 05.07.2019 Спасибо за все полезные ответы.Следующий код и рис 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_()) 

1 Ответ

0 голосов
/ 02 июля 2019

Вот способ. В этом примере виджеты (в данном случае QLineEdit s) хранятся в списке 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()
...