如何使 QComboBox 组互斥?

问题描述

一旦在组合中选择了一个项目,它就应该从其他项目中删除,除非它是“没有用”。

我为QComboBox做了三个选项,每个选项都包含相同的项目。

解释是这样的:

  • QComboBox Tug 1 共有 4 个项目('No Use'、'207HR'、'306DR'、'Jupiter')

  • QComboBox Tug 2 共有 4 个项目('No Use'、'207HR'、'306DR'、'Jupiter')

  • QComboBox Tug 3 共有 4 个项目('No Use'、'207HR'、'306DR'、'Jupiter')

那些 QcomboBox认值是“不使用”。

如何从 QComboBox Tug 2 中删除 QComboBox Tug 1 的选定值?

重点是“No Use”不应被删除;只有“207HR”、“306DR”和“Jupiter”中的一项。

我制作的代码如下:

class Ship_Use_Tug_Input_Program(QWidget):
    def __init__(self,master):
        super().__init__()
        self.initUI()

    def initUI(self):
        tug1_cb = QComboBox(self)
        jeju_tug = ['No use','207HR (2,500HP)','306DR (3,600HP)','Jupiter (3,600HP)']
        tug1_cb.addItems(jeju_tug)

        tug2_cb = QComboBox(self)
        tug2_cb.addItems(jeju_tug)

        tug3_cb = QComboBox(self)
        tug3_cb.addItems(jeju_tug)

        self.setGeometry(100,100,1000,500) 
        self.setwindowTitle('Ship_Use_Tug_Input_Program')
        self.show()
app = QApplication(sys.argv)
exc = Ship_Use_Tug_Input_Program(master=Ship_Use_Tug_Input_Program)
app.exec_()

说明照片如下:

enter image description here

解决方法

组合框的 view-widget 可用于隐藏行,而 item-data 可用于跟踪哪个组合框显示哪一行。连接到 activated signal 的插槽可以在当前项目之一发生变化时更新项目。

以下是实现该功能的完整演示脚本。 ExclusiveComboGroup 类可用于任何组合框组。要使用它,只需创建一个实例,然后使用其 addCombo 方法添加所有组合框。

enter image description here

演示脚本

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

class ExclusiveComboGroup(QObject):
    def __init__(self,parent=None):
        super().__init__(parent)
        self._combos = []
        self._role = Qt.UserRole + 500

    def addCombo(self,combo):
        combo.activated.connect(
            lambda: self.handleActivated(combo))
        self._combos.append(combo)

    def handleActivated(self,target):
        index = target.currentIndex()
        groupid = id(target)
        for combo in self._combos:
            if combo is target:
                continue
            previous = combo.findData(groupid,self._role)
            if previous >= 0:
                combo.view().setRowHidden(previous,False)
                combo.setItemData(previous,None,self._role)
            if index > 0:
                combo.setItemData(index,groupid,self._role)
                combo.view().setRowHidden(index,True)

class Window(QWidget):
    def __init__(self):
        super().__init__()
        self.group = QGroupBox('Selected Tug')
        layout = QVBoxLayout(self)
        layout.addWidget(self.group)
        layout = QFormLayout(self.group)
        layout.setVerticalSpacing(15)
        layout.setHorizontalSpacing(50)
        jeju_tug = [
            'No use','207HR (2,500HP)','306DR (3,600HP)','Jupiter (3,]
        # create a combo-group
        self.tugs = ExclusiveComboGroup(self)
        for index in range(3):
            combo = QComboBox(self)
            combo.addItems(jeju_tug)
            layout.addRow(f'Tug {index + 1}',combo)
            # add the combo-box
            self.tugs.addCombo(combo)

if __name__ == "__main__":

    app = QApplication(sys.argv)
    window = Window()
    window.setWindowTitle('Demo')
    window.setGeometry(800,200,100,50)
    window.show()
    sys.exit(app.exec_())

PS:以下是如何在您自己的示例中使用它:

def initUI(self):
    tug1_cb = QComboBox(self)
    jeju_tug = ['No use',600HP)']
    tug1_cb.addItems(jeju_tug)

    tug2_cb = QComboBox(self)
    tug2_cb.addItems(jeju_tug)

    tug3_cb = QComboBox(self)
    tug3_cb.addItems(jeju_tug)
    
    # copy the ExclusiveComboGroup class into
    # your code and then add this section
    tugs = ExclusiveComboGroup(self)
    tugs.addCombo(tug1_cb)
    tugs.addCombo(tug2_cb)
    tugs.addCombo(tug3_cb)

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...