PyQt5运行插槽以选择默认组合框

时间:2018-08-23 16:00:47

标签: python python-3.x pyqt pyqt5 qcombobox

我创建了一个QComboBox(我们称其为QC1),该填充了另一个QComboBox(QC2),后者又创建了一个组框。

我想为QC1和QC2的默认项以及更改QC1时的QC2的默认项激活插槽。我尝试在整个网络中搜索,但无济于事。

import sys
from PyQt5 import QtCore, QtWidgets, QtGui
from PyQt5.QtWidgets import QMainWindow, QLabel, QGridLayout, QWidget

class Window(QMainWindow):
    def __init__(self):
        super(Window,self).__init__()

        centralWidget = QtWidgets.QWidget(self)
        self.setCentralWidget(centralWidget)

        self.vBox = QtWidgets.QVBoxLayout()
        self.QC1 = QtWidgets.QComboBox(self)
        self.QC1.addItems(['C1-Op1','C1-Op2'])
        self.vBox.addWidget(self.QC1)

        self.QC2 = QtWidgets.QComboBox(self)
        self.QC2.addItem('')
        self.vBox.addWidget(self.QC2)            
        self.QC1.activated[str].connect(self.QC1_activate)

        self.gBox = QtWidgets.QGroupBox()
        self.vBox_gB = QtWidgets.QVBoxLayout()
        self.vBox.addWidget(self.gBox)
        centralWidget.setLayout(self.vBox)


    def QC1_activate(self,text):
        self.QC2.clear()
        dic={'C1-Op1':'C2-Op1','C1-Op2':'C2-Op2'}
        self.QC2.addItem(dic[text])
        self.QC2.activated[str].connect(self.QC2_activate)

    def QC2_activate(self,text):
        self.clearLayout(self,self.vBox_gB)
        lbl = QLabel(text) 
        self.vBox_gB.addWidget(lbl)
        self.gBox.setLayout(self.vBox_gB)


    @staticmethod
    def clearLayout(self, layout):
        if layout is not None:
            while layout.count():
                item = layout.takeAt(0)
                widget = item.widget()
                if widget is not None:
                    widget.deleteLater()
                else:
                    self.clearLayout(item.layout())


if __name__ == '__main__':
    app = QtWidgets.QApplication(sys.argv)
    GUI = Window()
    GUI.show()
    sys.exit(app.exec_())

上面是我想出的最简单的示例

2 个答案:

答案 0 :(得分:0)

抱歉,如果我理解正确,您想获取QC2中已激活的QGroupBox元素的历史记录。

我不明白为什么需要静态方法clearLayout

尝试下面的示例,也许它将带您获得新的想法。

import sys
#from PyQt5 import QtCore, QtWidgets, QtGui
from PyQt5.QtWidgets import (QMainWindow, QLabel, QGridLayout, QWidget,
                             QVBoxLayout, QComboBox, QApplication, QGroupBox)

class Window(QMainWindow):
    def __init__(self):
        super(Window,self).__init__()

        centralWidget = QWidget()               
        self.setCentralWidget(centralWidget)

        self.vBox = QVBoxLayout()
        self.QC1  = QComboBox(self)
        self.QC1.addItems(['C1-Op1', 'C1-Op2'])
        self.vBox.addWidget(self.QC1)

        self.QC2 = QComboBox()                  
        #self.QC2.addItem('')
        self.QC2.addItem('Some element popup list')
        self.vBox.addWidget(self.QC2)  

        self.QC1.activated[str].connect(self.QC1_activate)
        self.QC2.activated[str].connect(self.QC2_activate)   # +++

        self.gBox    = QGroupBox(" * QGroupBox * ")
        self.vBox_gB = QVBoxLayout()
        self.vBox.addWidget(self.gBox)
        centralWidget.setLayout(self.vBox)

    def QC1_activate(self, text):
        #self.QC2.clear()
        dic = {'C1-Op1':'C2-Op1','C1-Op2':'C2-Op2'}
        #self.QC2.addItem(dic[text])

        # +++
        if self.QC2.count() == 1:
            self.QC2.addItem(dic[text])
        else:
            self.QC2.setItemText(1, dic[text])

        #self.QC2.activated[str].connect(self.QC2_activate)  

    def QC2_activate(self, text):
        #self.clearLayout(self, self.vBox_gB) 
        lbl = QLabel(text) 
        self.vBox_gB.addWidget(lbl)
        self.gBox.setLayout(self.vBox_gB)

    #@staticmethod                   ???
    #def clearLayout(self, layout):  ??? 
    # ...      


if __name__ == '__main__':
    app = QApplication(sys.argv)
    GUI = Window()
    GUI.show()
    sys.exit(app.exec_())

enter image description here

答案 1 :(得分:0)

整个项目可以简化很多(我不明白为什么将dicts放到组合框中,但无论如何)。我想您想要的是:

self.QC2.addItem(dic[text]) # Your code
self.QC2.activated[str].connect(self.QC2_activate) # Your code
self.QC2.setCurrentText(dic[text]) # New code

最后一行设置了该组合的当前文本。我目前无法测试,但是激活后应该会触发。如果不行,则可以将触发器从activated更改为currentTextChanged之类的东西,它肯定应该起作用。