Python:如何共享同一个小部件

Posted

技术标签:

【中文标题】Python:如何共享同一个小部件【英文标题】:Python: How to share the same widget 【发布时间】:2014-03-24 19:31:06 【问题描述】:

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_())

【问题讨论】:

AFAIK 每个小部件只能有一个父级。 有什么办法解决它?一定有办法解决的。 【参考方案1】:

据我所知,每个小部件都有一个父级。

您可以考虑使用两个共享一个且仅一个模型的QListView 小部件(而不是QListWidget)。这样可以避免您担心重复/重复代码。

【讨论】:

除了 QListWidget 之外,该对话框几乎没有其他小部件。但感谢您的技巧。 @Sputnix 在这种情况下,一个肮脏、肮脏的解决方法是,每次用户切换选项卡时更改小部件的父级。我不会提倡这个。 为什么不呢?对我来说听起来很棒! 小部件和它的克隆是否共享相同的状态,或者它们只是看起来相同? ListWidget 会填充不同的数据并选择不同的选项卡。无论用于填充 ListWidget 的数据如何,单击 ListItems 都会触发相同的功能 - 这是我不想处理另一个 ListWidget 的原因。【参考方案2】:

谢谢各位!在这里它在起作用(对话框打开后点击选项卡让它做生意):

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_())

【讨论】:

以上是关于Python:如何共享同一个小部件的主要内容,如果未能解决你的问题,请参考以下文章

如何在活动和小部件之间共享数据?

如何在活动和小部件之间共享数据和方法

如何使用 Python 中用 Vala 编写的自定义 GTK 小部件?

如何创建一个共享目录以在集成测试和小部件测试之间共享代码?

当包装似乎不可能时如何共享预配置的小部件

如何使用python制作android小部件?