pySide QComboBox 刷新

0 投票
1 回答
801 浏览
提问于 2025-04-18 10:44
from PySide import QtGui, QtCore

def listItems():
    itemList = ("first","second","etc..")
    return itemList

class tabDialog(QtGui.QDialog):
    def __init__(self, parent=None):
        QtGui.QDialog.__init__(self, parent)

        tabWidget = QtGui.QTabWidget()
        tabWidget.addTab(mainTab(), self.tr("Main"))
        tabWidget.addTab(secondTab(), self.tr("Second "))

        mainLayout = QtGui.QVBoxLayout()
        mainLayout.addWidget(tabWidget)
        self.setLayout(mainLayout)

class mainTab(QtGui.QWidget):
    def __init__(self,  parent=None):
        QtGui.QWidget.__init__(self, parent)

        self.createGroup = QtGui.QGroupBox(self.tr("Add Item to list"))
        self.fileNameEdit = QtGui.QLineEdit(self)        
        self.fileNameEdit.setPlaceholderText("new item")


        self.createButton = QtGui.QPushButton('add',self)
        #self.createButton.clicked.connect(self.additemToList)

        self.createLayout = QtGui.QGridLayout()
        self.createLayout.addWidget(self.fileNameEdit,1,2)
        self.createLayout.addWidget(self.createButton,1,3)
        self.setLayout(self.createLayout) 
        self.createGroup.setLayout(self.createLayout)      


        self.addGroup = QtGui.QGroupBox(self.tr("list items"))
        self.projectLabel = QtGui.QLabel(self.tr("item : "))
        self.projectListCombo = QtGui.QComboBox(self)
        self.projectListCombo.addItems(listItems())
        self.addLayout = QtGui.QHBoxLayout()
        self.addLayout.addWidget(self.projectLabel)
        self.addLayout.addWidget(self.projectListCombo) 
        self.addGroup.setLayout(self.addLayout)

        self.mainLayout = QtGui.QVBoxLayout()
        self.mainLayout.addWidget(self.createGroup)
        self.mainLayout.addWidget(self.addGroup)        
        self.setLayout(self.mainLayout)


class secondTab(QtGui.QWidget):
    def __init__(self,  parent=None):
        QtGui.QWidget.__init__(self, parent)      
        self.initUI()


    def initUI(self):     

        self.addGroup = QtGui.QGroupBox(self.tr("list items"))
        self.projectLabel = QtGui.QLabel(self.tr("item : "))
        self.projectListCombo = QtGui.QComboBox(self)
        self.projectListCombo.addItems(listItems())
        self.addLayout = QtGui.QHBoxLayout()
        self.addLayout.addWidget(self.projectLabel)
        self.addLayout.addWidget(self.projectListCombo) 
        self.addGroup.setLayout(self.addLayout)

        self.mainLayout = QtGui.QVBoxLayout()
        self.mainLayout.addWidget(self.addGroup)        
        self.setLayout(self.mainLayout)



tabdialog = tabDialog()
tabdialog.show()

有两个标签页。在第一个标签页里,有一个文本框、一 个添加项目的按钮和一个下拉框;在第二个标签页里,只有一个下拉框。两个下拉框里的内容是一样的。如果往列表里添加了项目,就需要刷新两个下拉框。

1 个回答

1

你可以使用 QComboBox::addItem 来添加项目:

from PySide import QtGui, QtCore
import sys

def listItems():
    itemList = ("first","second","etc..")
    return itemList


class tabDialog(QtGui.QDialog):
    def __init__(self, parent=None):
        QtGui.QDialog.__init__(self, parent)

        self.tabWidget = QtGui.QTabWidget()
        self.mainTab = mainTab(self)
        self.secondTab = secondTab(self)

        self.tabWidget.addTab(self.mainTab, self.tr("Main"))
        self.tabWidget.addTab(self.secondTab, self.tr("Second "))

        mainLayout = QtGui.QVBoxLayout()
        mainLayout.addWidget(self.tabWidget)
        self.setLayout(mainLayout)

    def additemToList(self):
        item = self.mainTab.fileNameEdit.text()
        self.mainTab.projectListCombo.addItem(item)
        self.secondTab.projectListCombo.addItem(item)


class mainTab(QtGui.QWidget):
    def __init__(self,  parent=tabDialog):
        QtGui.QWidget.__init__(self, parent)
        self.q = 1234
        self.createGroup = QtGui.QGroupBox(self.tr("Add Item to list"))
        self.fileNameEdit = QtGui.QLineEdit(self)
        self.fileNameEdit.setPlaceholderText("new item")


        self.createButton = QtGui.QPushButton('add',self)
        self.createButton.clicked.connect(parent.additemToList)

        self.createLayout = QtGui.QGridLayout()
        self.createLayout.addWidget(self.fileNameEdit,1,2)
        self.createLayout.addWidget(self.createButton,1,3)
        self.setLayout(self.createLayout)
        self.createGroup.setLayout(self.createLayout)


        self.addGroup = QtGui.QGroupBox(self.tr("list items"))
        self.projectLabel = QtGui.QLabel(self.tr("item : "))
        self.projectListCombo = QtGui.QComboBox(self)
        self.projectListCombo.addItems(listItems())
        self.addLayout = QtGui.QHBoxLayout()
        self.addLayout.addWidget(self.projectLabel)
        self.addLayout.addWidget(self.projectListCombo)
        self.addGroup.setLayout(self.addLayout)

        self.mainLayout = QtGui.QVBoxLayout()
        self.mainLayout.addWidget(self.createGroup)
        self.mainLayout.addWidget(self.addGroup)
        self.setLayout(self.mainLayout)



class secondTab(QtGui.QWidget):
    def __init__(self,  parent=tabDialog):
        QtGui.QWidget.__init__(self, parent)
        self.initUI()


    def initUI(self):

        self.addGroup = QtGui.QGroupBox(self.tr("list items"))
        self.projectLabel = QtGui.QLabel(self.tr("item : "))
        self.projectListCombo = QtGui.QComboBox(self)
        self.projectListCombo.addItems(listItems())
        self.addLayout = QtGui.QHBoxLayout()
        self.addLayout.addWidget(self.projectLabel)
        self.addLayout.addWidget(self.projectListCombo)
        self.addGroup.setLayout(self.addLayout)

        self.mainLayout = QtGui.QVBoxLayout()
        self.mainLayout.addWidget(self.addGroup)
        self.setLayout(self.mainLayout)



def main():
    app = QtGui.QApplication(sys.argv)
    tabdialog = tabDialog()
    tabdialog.show()
    app.exec_()

if __name__ == '__main__':
    main()

我做了以下几个修改:

  1. mainTabsecondTab 现在是 tabDialog 的实例属性,也就是说它们是属于这个对话框的。
  2. mainTabsecondTab 现在把 tabDialog 当作它们的父级,这样它们就可以和这个对话框更好地配合。
  3. tabDialog 中添加了一个叫 additemToList 的方法。
  4. mainTab.__init__() 方法里,添加了 self.createButton.clicked.connect(parent.additemToList),这行代码的意思是当按钮被点击时,会调用父级的 additemToList 方法。

撰写回答