8wDlpd.png
8wDFp9.png
8wDEOx.png
8wDMfH.png
8wDKte.png

PyQt:如何设置组合框项为可勾选?

Abhishek-M 1月前

65 0

为了将 GUI 小部件数量保持在最低限度,我需要找到一种方法来让用户选择下拉菜单项,这些菜单项可用于过滤 listWidget 中显示的项目。假设

为了将 GUI 小部件数量保持在最低限度,我需要找到一种方法来让用户选择下拉菜单项,这些菜单项可用于过滤 listWidget 中显示的项目。假设 listWidget 列出了 5 个不同类别的项目:\'Cat A\'、\'Cat B\'、\'Cat C\'、\'Cat D\'、\'Cat E\'。我可以为每个项目类别实现单选按钮或复选框。但是 5 个单选按钮或复选框会占用大量的 GUI 空间。带有可勾选项目的组合框似乎是正确的选择。有什么想法吗?

from PyQt4 import QtGui, QtCore
import sys, os


class CheckableComboBox(QtGui.QComboBox):
    def __init__(self):    
        super(CheckableComboBox, self).__init__()

    def flags(self, index):
        return Qt.ItemIsUserCheckable | Qt.ItemIsSelectable | Qt.ItemIsEnabled


class Dialog_01(QtGui.QMainWindow):
    def __init__(self):
        super(QtGui.QMainWindow,self).__init__()

        myQWidget = QtGui.QWidget()
        myBoxLayout = QtGui.QVBoxLayout()
        myQWidget.setLayout(myBoxLayout)
        self.setCentralWidget(myQWidget)

        self.ComboBox = CheckableComboBox()
        for i in range(3):
            self.ComboBox.addItem("Combobox Item " + str(i))

        myBoxLayout.addWidget(self.ComboBox)


if __name__ == '__main__':
    app = QtGui.QApplication(sys.argv)
    dialog_1 = Dialog_01()
    dialog_1.show()
    dialog_1.resize(480,320)
    sys.exit(app.exec_())
帖子版权声明 1、本帖标题:PyQt:如何设置组合框项为可勾选?
    本站网址:http://xjnalaquan.com/
2、本网站的资源部分来源于网络,如有侵权,请联系站长进行删除处理。
3、会员发帖仅代表会员个人观点,并不代表本站赞同其观点和对其真实性负责。
4、本站一律禁止以任何方式发布或转载任何违法的相关信息,访客发现请向站长举报
5、站长邮箱:yeweds@126.com 除非注明,本帖由Abhishek-M在本站《qt》版块原创发布, 转载请注明出处!
最新回复 (0)
  • (这不是问题的答案,因此我使用了这里的大部分代码)

    如果其他人想要一个 RadioComboBox 类,我添加了一个函数并将名称更改为 RadioComboBox。

    from PyQt4 import QtCore
    from PyQt4.QtGui import QComboBox, QStandardItemModel
    
    
    class RadioComboBox(QComboBox):
        def __init__(self):
            super(RadioComboBox, self).__init__()
            self.view().pressed.connect(self.handle_item_pressed)
            self.setModel(QStandardItemModel(self))
    
        def handle_item_pressed(self, index):
            item = self.model().itemFromIndex(index)
            target_row = item.index().row()
            if item.checkState() != QtCore.Qt.Checked:
                item.setCheckState(QtCore.Qt.Checked)
            self.check_others(target_row)
    
        def check_others(self, target_row):
            for i in range(self.model().rowCount()):
                if i == target_row:
                    continue
                else:
                    item = self.model().item(i)
                    item.setCheckState(QtCore.Qt.Unchecked)
    
  • @Sputnix:如果您希望检查多个选项,那么 ListView 将是一个更好的选择。

  • 我认为这可能是不可能的,因为组合框用于从列表中选择 1 个选项。我对此不太确定,我必须检查一下。

  • 刚刚将其添加到代码中。谢谢!我找不到设置多个组合框项目的方法。可能吗?我需要同时检查多个项目...

  • 这很简单。只需使用与 comboBox 关联的模型中的 flags() 函数将项目设置为 Checkable 即可。

    def flags(self, index):
        return Qt.ItemIsUserCheckable | Qt.ItemIsSelectable | Qt.ItemIsEnabled
    

    更新


    这可能不是最好的方法,但它应该能解决你的问题。这里有一个你可能想看的东西,如果你有空间限制,无法显示完整的 listView,只需调整它的大小,直到它看起来像一个 ComboBox。

    enter image description here

  • 如果没有向 QMenu 添加 .addAction() 操作,则单击 QToolButton 会出现警告:void QCocoaWindow::syncWindowState(Qt::WindowState) 无效的窗口内容视图大小,请检查窗口几何形状。我想知道是否是 .setPopupMode 方法触发了它?如果没有连接任何操作,应该是 QtGui.QToolButton \'unset\' 来自 .setPopupMode(QtGui.QToolButton.InstantPopup)?

  • @Sputnix。只需连接到工具菜单的触发信号 - 它会发送触发的操作。此外,您还可以使用其操作方法迭代菜单的操作。

  • 如果我使用 self.connect(action, QtCore.SIGNAL(\'triggered()\'), self.myMethod),则不会发送任何参数。将工具菜单的操作作为参数提交给 myMethod(self, arg) 是有意义的。您介意展示如何将每个操作挂接到用于接收操作作为参数的方法吗(这样可以验证操作的 \'checked\' 状态(连同其名称)?(此处的 \'action\' 是实例名称之一:action = self.toolmenu.addAction(\'Category \' + str(i)) 的结果

  • 这种多选组合的想法 以前就出现过 ,但我不确定它是否是最好的解决方案。实际上,所需要的只是一个带有下拉菜单的工具按钮(类似于 Web 浏览器中的历史记录按钮)。

    下面是一个基本演示,说明了这两个选项(左边的按钮,右边的组合):

    screenshot screenshot

    PyQt5 的安装方法

    from PyQt5 import QtCore, QtGui, QtWidgets
    
    class CheckableComboBox(QtWidgets.QComboBox):
        def __init__(self, title = '', parent=None):
            super().__init__(parent)
            self.setTitle(title)
            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)
    
        def title(self):
            return self._title
    
        def setTitle(self, title):
            self._title = title
            self.repaint()
    
        def paintEvent(self, event):
            painter = QtWidgets.QStylePainter(self)
            painter.setPen(self.palette().color(QtGui.QPalette.Text))
            opt = QtWidgets.QStyleOptionComboBox()
            self.initStyleOption(opt)
            opt.currentText = self._title
            painter.drawComplexControl(QtWidgets.QStyle.CC_ComboBox, opt)
            painter.drawControl(QtWidgets.QStyle.CE_ComboBoxLabel, opt)
    
    class Dialog(QtWidgets.QWidget):
        def __init__(self):
            super().__init__()
            hbox = QtWidgets.QHBoxLayout()
            self.comboBox = CheckableComboBox('Categories', self)
            self.toolButton = QtWidgets.QToolButton(self)
            self.toolButton.setText('Categories ')
            self.toolMenu = QtWidgets.QMenu(self)
            for index in range(3):
                self.comboBox.addItem(f'Category {index}')
                item = self.comboBox.model().item(index, 0)
                item.setCheckState(QtCore.Qt.Unchecked)
                action = self.toolMenu.addAction(f'Category {index}')
                action.setCheckable(True)
            self.toolButton.setMenu(self.toolMenu)
            self.toolButton.setPopupMode(QtWidgets.QToolButton.InstantPopup)
            hbox.addWidget(self.toolButton)
            hbox.addWidget(self.comboBox)
            layout = QtWidgets.QVBoxLayout(self)
            layout.addLayout(hbox)
            layout.addStretch()
    
    if __name__ == '__main__':
    
        app = QtWidgets.QApplication(['Test'])
        dialog = Dialog()
        dialog.show()
        app.exec()
            
    

    PyQt4

    from PyQt4 import QtCore, QtGui
    
    class CheckableComboBox(QtGui.QComboBox):
        def __init__(self, title = '', parent=None):
            super().__init__(parent)
            self.setTitle(title)
            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)
    
        def title(self):
            return self._title
    
        def setTitle(self, title):
            self._title = title
            self.repaint()
    
        def paintEvent(self, event):
            painter = QtGui.QStylePainter(self)
            painter.setPen(self.palette().color(QtGui.QPalette.Text))
            opt = QtGui.QStyleOptionComboBox()
            self.initStyleOption(opt)
            opt.currentText = self._title
            painter.drawComplexControl(QtGui.QStyle.CC_ComboBox, opt)
            painter.drawControl(QtGui.QStyle.CE_ComboBoxLabel, opt)
    
    class Dialog(QtGui.QWidget):
        def __init__(self):
            super().__init__()
            hbox = QtGui.QHBoxLayout()
            self.comboBox = CheckableComboBox('Categories', self)
            self.toolButton = QtGui.QToolButton(self)
            self.toolButton.setText('Categories ')
            self.toolMenu = QtGui.QMenu(self)
            for index in range(3):
                self.comboBox.addItem('Category %s' % index)
                item = self.comboBox.model().item(index, 0)
                item.setCheckState(QtCore.Qt.Unchecked)
                action = self.toolMenu.addAction('Category %s' % index)
                action.setCheckable(True)
            self.toolButton.setMenu(self.toolMenu)
            self.toolButton.setPopupMode(QtGui.QToolButton.InstantPopup)
            hbox.addWidget(self.toolButton)
            hbox.addWidget(self.comboBox)
            layout = QtGui.QVBoxLayout(self)
            layout.addLayout(hbox)
            layout.addStretch()
    
    if __name__ == '__main__':
    
        app = QtGui.QApplication(['Test'])
        dialog = Dialog()
        dialog.show()
        app.exec()
    
返回
作者最近主题: