Python:如何共享相同的控件

4 投票
2 回答
2201 浏览
提问于 2025-04-17 23:42

这里有一个QTabWidget,里面有两个标签:'A'和'B'。

还有一个叫listWidgetA的列表控件(QtGui.QListWidget()),我想在'A'和'B'这两个标签之间共享这个控件。

到目前为止,我还没找到办法把listWidgetA同时放到两个不同的布局里。把它放到一个布局里,就会立刻把它从另一个布局中移除。我不想再创建一个新的QtGui.QListWidget(),因为那样会导致很多重复的代码。下面是一个例子。如果有办法解决这种情况,那就太好了。

from PyQt4 import QtGui, QtCore
import sys, os


class Dialog_01(QtGui.QMainWindow):
    def __init__(self):
        super(QtGui.QMainWindow,self).__init__()

        myTabWidget = QtGui.QTabWidget()

        QGroupBoxA = QtGui.QGroupBox()
        QHBoxLayoutA = QtGui.QHBoxLayout()

        QGroupBoxA.setLayout(QHBoxLayoutA)
        myTabWidget.addTab(QGroupBoxA,' Tab A ')

        listWidgetA = QtGui.QListWidget()
        for i in range(12): 
            QtGui.QListWidgetItem( 'Item '+str(i), listWidgetA )

        QHBoxLayoutA.addWidget(listWidgetA)


        QGroupBoxB = QtGui.QGroupBox()
        QHBoxLayoutB = QtGui.QHBoxLayout()
        QGroupBoxB.setLayout(QHBoxLayoutB)

        # QHBoxLayoutB.addWidget(listWidgetA)   
        myTabWidget.addTab(QGroupBoxB,' Tab B ')

        self.setCentralWidget(myTabWidget)

if __name__ == '__main__':
    app = QtGui.QApplication(sys.argv)
    dialog_1 = Dialog_01()
    dialog_1.show()
    dialog_1.resize(480,320)
    sys.exit(app.exec_())

2 个回答

3

谢谢大家!这里是它的实际效果(对话框打开后,点击标签让它开始工作):

from PyQt4 import QtGui, QtCore
import sys, os

class Dialog_01(QtGui.QMainWindow):
    def __init__(self):
        super(QtGui.QMainWindow,self).__init__()

        myTabWidget = QtGui.QTabWidget()        

        self.QGroupBoxA = QtGui.QGroupBox()        
        myTabWidget.addTab(self.QGroupBoxA,' Tab A ')        

        self.QGroupBoxB = QtGui.QGroupBox()        
        myTabWidget.addTab(self.QGroupBoxB,' Tab B ')

        self.QHBoxLayout = QtGui.QHBoxLayout()
        self.listWidget = QtGui.QListWidget()

        self.QHBoxLayout.addWidget(self.listWidget)

        myTabWidget.connect(myTabWidget, QtCore.SIGNAL("currentChanged(int)"), self.tabSelected) 

        self.setCentralWidget(myTabWidget)

    def tabSelected(self, arg=None):
        self.listWidget.clear()
        if arg==0: 
            self.QGroupBoxA.setLayout(self.QHBoxLayout)
            for i in range(12): 
                QtGui.QListWidgetItem( 'A Item '+str(i), self.listWidget )

        if arg==1: 
            self.QGroupBoxB.setLayout(self.QHBoxLayout)      
            for i in range(12): 
                QtGui.QListWidgetItem( 'B Item '+str(i), self.listWidget )


if __name__ == '__main__':
    app = QtGui.QApplication(sys.argv)
    dialog_1 = Dialog_01()
    dialog_1.show()
    dialog_1.resize(480,320)
    sys.exit(app.exec_())
4

据我所知,每个小部件(widget)都有且只有一个父级。

你可以考虑使用两个 QListView 小部件(而不是 QListWidget),它们共享同一个模型。这样可以避免你担心重复代码的问题。

撰写回答