我创建了一个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_())
上面是我想出的最简单的示例
答案 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_())
答案 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
之类的东西,它肯定应该起作用。