微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如何使 QComboBox 组互斥?

如何解决如何使 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)

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?