python - PyQt 中的动态小部件添加

标签 python python-3.x pyqt pyqt5

我是 PyQt 的新手,我正在尝试创建一个系统,当用户按添加时动态添加小部件。

我希望将相同的 self.comboBox 小部件添加到“添加”按钮上方。我还会制作一个删除按钮,但我相信这不会有问题。

此外,当用户选择一个选项(又名选项不是 -Select-)时,我希望某些复选框出现在 self.combobox 旁边。

最后,如何在复选框和组合框中存储用户的选择?我要声明一个变量还是什么?

我的代码太多而难以阅读,所以改为:

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.

What I want

最佳答案

抱歉。如果我理解正确,您的示例可能如下所示:

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

关于python - PyQt 中的动态小部件添加,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52389811/

相关文章:

python - jupyter notebook 停止 SSL 错误

java - Word XML 到 RTF 转换

python - 将字典附加到数据框中,其中字典键与某些 df 行值匹配

python - 从 PyQt4 ListWidgetItem 获取所有数据

python - PyQt5:线程中的计时器

python - 如何从等距柱状投影绘制正射投影

python-3.x - 根据现有列中的值创建新列

python - 关于python中的def和return函数

python - 字节到字符串到字节。 python 3

python - Qt 将不需要的参数传递给槽