Добавление динамического виджета в PyQt - PullRequest
0 голосов
/ 18 сентября 2018

Я новичок в PyQt и пытаюсь создать систему, которая динамически добавляет виджеты, когда пользователь нажимает add.

Я хочу, чтобы тот же виджет self.comboBox был добавлен выше кнопка Добавить.Я также сделаю кнопку удаления, но я считаю, что это не будет проблемой.

Более того, я хотел бы, чтобы рядом с self.combobox появлялись определенные флажки, когда пользователь выбирает опцию (иначе опция не -Select-).

Наконец, как я могу сохранить выбор пользователя в флажках и в выпадающем списке?Я объявляю переменную или что именно?

Мой код был слишком много для чтения, так что вместо этого:

class myWindow(QWidget):
    def __init__(self):
        super().__init__()
        self.init()
        self.organize()

    def init(self):
        self.label = QLabel("Label")
        self.comboBox = QComboBox(self)
        self.comboBox.addItem("-Select-")
        self.comboBox.addItem("1")
        self.comboBox.addItem("2")
        self.comboBox.addItem("3")
        self.addbtn = QPushButton("Add")
        self.addbtn.clicked.connect(self.addComboBox)

    def organize(self):
        grid = QGridLayout(self)
        self.setLayout(grid)

        grid.addWidget(Label, 0, 0, 0, 2)
        grid.addWidget(self.comboBox, 1, 2, 1, 3)
        grid.addWidget(self.addbtn, 2, 2)

    def addComboBox(self):
        #Code to add a combo box just like self.comboBox above addbtn and below all existing comboBoxes.

Что я хочу

1 Ответ

0 голосов
/ 18 сентября 2018

Извините.Если я вас правильно понимаю, ваш пример может выглядеть примерно так:

import sys
from PyQt5.QtGui import *
from PyQt5.QtCore import *
from PyQt5.QtWidgets import *

class CheckableComboBox(QComboBox):
    def __init__(self, parent = None):
        super(CheckableComboBox, self).__init__(parent)
        self.parent = parent
        self.setView(QListView(self))
        self.view().pressed.connect(self.handleItemPressed)
        self.setModel(QStandardItemModel(self))

    def handleItemPressed(self, index):
        item = self.model().itemFromIndex(index)
        if item.checkState() == Qt.Checked:
            item.setCheckState(Qt.Unchecked)
        else:
            item.setCheckState(Qt.Checked)
        self.on_selectedItems()    

    def checkedItems(self):
        checkedItems = []
        for index in range(self.count()):
            item = self.model().item(index)
            if item.checkState() == Qt.Checked:
                checkedItems.append(item)
        return checkedItems

    def on_selectedItems(self):
        selectedItems = self.checkedItems()
        self.parent.lblSelectItem.setText("")
        for item in selectedItems:  
            self.parent.lblSelectItem.setText("{} {} "
                       "".format(self.parent.lblSelectItem.text(), item.text()))


class ExampleWidget(QGroupBox):
    def __init__(self, numAddWidget):
        QGroupBox.__init__(self)
        self.numAddWidget = numAddWidget
        self.numAddItem   = 1
        self.setTitle("Title {}".format(self.numAddWidget)) 
        self.initSubject()
        self.organize()

    def initSubject(self):
        self.lblName = QLabel("Label Title {}".format(self.numAddWidget), self)
        self.lblSelectItem = QLabel(self)

        self.teachersselect = CheckableComboBox(self)
        self.teachersselect.addItem("-Select {}-".format(self.numAddItem))
        item = self.teachersselect.model().item(0, 0)
        item.setCheckState(Qt.Unchecked)

        self.addbtn = QPushButton("ComboBoxAddItem...", self)
        self.addbtn.clicked.connect(self.addTeacher)

    def organize(self):
        grid = QGridLayout(self)
        self.setLayout(grid)
        grid.addWidget(self.lblName,        0, 0, 1, 3)
        grid.addWidget(self.lblSelectItem,  1, 0, 1, 2)
        grid.addWidget(self.teachersselect, 1, 2)
        grid.addWidget(self.addbtn,         3, 2)

    def addTeacher(self):
        self.numAddItem += 1
        self.teachersselect.addItem("-Select {}-".format(self.numAddItem))
        item = self.teachersselect.model().item(self.numAddItem-1, 0)
        item.setCheckState(Qt.Unchecked) 


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

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

        self.area = QScrollArea(self)
        self.area.setWidgetResizable(True)
        self.scrollAreaWidgetContents = QWidget()
        self.scrollAreaWidgetContents.setGeometry(0, 0, 200, 100)

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

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

        self.widget = ExampleWidget(self.numAddWidget)
        self.gridLayout.addWidget(self.widget)
        self.setGeometry(700, 200, 350, 300)        

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

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

enter image description here

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...