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:如何共享同一个小部件的主要内容,如果未能解决你的问题,请参考以下文章