为了账号安全,请及时绑定邮箱和手机立即绑定

如何从多选 QComboBox 中获取选中的项目?

如何从多选 QComboBox 中获取选中的项目?

一只萌萌小番薯 2021-11-09 15:36:20
我能够使用 QComboBox 和 QStandardItemModel 实现多选,但我无法使用 selectedItems() 或 checkedItems() 选项获取所选项目,该选项给出的错误消息显示为:AttributeError: 'QComboBox' object has no attribute 'selectedItems'               AttributeError: 'QComboBox' object has no attribute 'checkedItems'有没有办法获取 QComboBox 的选定项目列表?下面是我的代码的示例实现class CheckableComboBox(QComboBox):    def __init__(self):        super(CheckableComboBox, self).__init__()        self.view().pressed.connect(self.handleItemPressed)        self.setModel(QtGui.QStandardItemModel(self))    def handleItemPressed(self, index):        item = self.model().itemFromIndex(index)        if item.checkState() == QtCore.Qt.Checked:            item.setCheckState(QtCore.Qt.Unchecked)        else:            item.setCheckState(QtCore.Qt.Checked)class Dialog_01(QMainWindow):    def __init__(self):        super(QMainWindow,self).__init__()               years = ["2017", "2018", "2019", "2020"]        self.comboBoxv = QComboBox(self)        self.model = QtGui.QStandardItemModel(self)        firstItem = QtGui.QStandardItem("Select  Years")        firstItem.setBackground(QtGui.QBrush(QtGui.QColor(200, 200, 200)))        firstItem.setSelectable(False)        self.model.setItem(0, 0, firstItem)        for i,area in enumerate(years):            item = QtGui.QStandardItem(area)            item.setFlags(Qt.ItemIsUserCheckable | Qt.ItemIsEnabled)            item.setData(Qt.Unchecked, Qt.CheckStateRole)            self.model.setItem(i+1, 0, item)        self.comboBoxv.setModel(self.model)                self.comboBoxv.installEventFilter(self)if __name__ == '__main__':    app = QApplication(sys.argv)    dialog_1 = Dialog_01()    dialog_1.show()    dialog_1.resize(480,320)    sys.exit(app.exec_())
查看完整描述

1 回答

?
翻过高山走不出你

TA贡献1875条经验 获得超3个赞

checkedItems 方法不存在,因此您会收到该错误。解决方案是迭代模型并验证它是否被检查。


from PyQt5 import QtCore, QtGui, QtWidgets


class CheckableComboBox(QtWidgets.QComboBox):

    closedPopup = QtCore.pyqtSignal()


    def __init__(self, parent=None):

        super(CheckableComboBox, self).__init__(parent)

        self.setView(QtWidgets.QListView(self))

        self.view().pressed.connect(self.handleItemPressed)

        self.setModel(QtGui.QStandardItemModel(self))


        firstItem = QtGui.QStandardItem("Select  Years")

        firstItem.setBackground(QtGui.QBrush(QtGui.QColor(200, 200, 200)))

        firstItem.setSelectable(False)

        self.model().appendRow(firstItem)


    @QtCore.pyqtSlot(QtCore.QModelIndex)

    def handleItemPressed(self, index):

        item = self.model().itemFromIndex(index)

        if item.checkState() == QtCore.Qt.Checked:

            item.setCheckState(QtCore.Qt.Unchecked)

        else:

            item.setCheckState(QtCore.Qt.Checked)


    def checkedItems(self):

        l = []

        for i in range(self.model().rowCount()):

            it = self.model().item(i)

            if it.checkState() == QtCore.Qt.Checked:

                l.append(it.text())

        return l


    def hidePopup(self):

        self.closedPopup.emit()

        super(CheckableComboBox, self).hidePopup()

        QtCore.QTimer.singleShot(0, lambda: self.setCurrentIndex(0))


class Dialog_01(QtWidgets.QMainWindow):

    def __init__(self):

        super(Dialog_01,self).__init__()       

        years = ["2017", "2018", "2019", "2020"]

        self.comboBoxv = CheckableComboBox()

        self.comboBoxv.closedPopup.connect(self.on_closedPopup)

        for i, area in enumerate(years):

            item = QtGui.QStandardItem(area)

            item.setCheckable(True)

            item.setCheckState(QtCore.Qt.Unchecked)

            self.comboBoxv.model().appendRow(item)


        central_widget = QtWidgets.QWidget()

        self.setCentralWidget(central_widget)

        lay = QtWidgets.QVBoxLayout(central_widget)

        lay.addWidget(self.comboBoxv)

        lay.addStretch()


    @QtCore.pyqtSlot()

    def on_closedPopup(self):

        print(self.comboBoxv.checkedItems())


if __name__ == '__main__':

    import sys

    app = QtWidgets.QApplication(sys.argv)

    dialog_1 = Dialog_01()

    dialog_1.show()

    dialog_1.resize(480,320)

    sys.exit(app.exec_())


查看完整回答
反对 回复 2021-11-09
  • 1 回答
  • 0 关注
  • 354 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信