gpt4 book ai didi

python - pyqt QTreeWidget setItemWidget 拖/放后消失

转载 作者:行者123 更新时间:2023-12-01 06:17:35 27 4
gpt4 key购买 nike

我试图在使用 QTreeWidget.setItemWidget() 重新父级(拖放)后将小部件放入 QTreeWidgetItem

但是,如果编译以下代码,结果是 QTreeWidgetItem 内的小部件消失。知道为什么吗?什么代码可以解决这个问题(用我猜的小部件重新填充 QTreeWidgetItem?)

from PyQt4.QtCore import *
from PyQt4.QtGui import *


class InlineEditor (QWidget):
_MUTE = 'MUTE'

def __init__ (self, parent):
QWidget.__init__ (self, parent)

self.setAutoFillBackground (True)
lo = QHBoxLayout()
lo.setSpacing(4)

self._cbFoo = QComboBox()
for x in ["ABC", "DEF", "GHI", "JKL"]:
self._cbFoo.addItem(x)

self._leBar = QLineEdit('', self)
lo.addWidget (self._cbFoo, 3)
lo.addSpacing (5)
lo.addWidget (QLabel ( 'Bar:'))
lo.addWidget (self._leBar, 3)
lo.addStretch (5)
self.setLayout (lo)

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

grid = QGridLayout ()
tree = QTreeWidget ()

# Here is the issue?
tree.setDragDropMode(QAbstractItemView.InternalMove)

tree.setColumnCount(3)

for n in range (2):
i = QTreeWidgetItem (tree) # create QTreeWidget the sub i
i.setText (0, "first" + str (n)) # set the text of the first 0
i.setText (1, "second")
for m in range (2):
j = QTreeWidgetItem(i)
j.setText (0, "child first" + str (m))

#b1 = QCheckBox("push me 0", tree) # this wont work w/ drag by itself either
#tree.setItemWidget (tree.topLevelItem(0).child(1), 1, b1)

item = InlineEditor(tree) # deal with a combination of multiple controls
tree.setItemWidget(tree.topLevelItem(0).child(1), 1, item)

grid.addWidget (tree)
self.setLayout (grid)

app = QApplication ([])
form = Form ()
form.show ()
app.exec_ ()

最佳答案

通过编写我自己的treeDropEvent,设法获得了相对“有效”的修复...但是,如果有人有更优雅的解决方案,请随时分享。下面的代码将解决其他人在树中使用 setItemWidgets 进行拖放的麻烦,欢呼。

from PyQt4.QtCore import *
from PyQt4.QtGui import *

class InlineEditor (QWidget):
_MUTE = 'MUTE'

def __init__ (self, parent):
QWidget.__init__ (self, parent)

self.setAutoFillBackground (True)
lo = QHBoxLayout()
lo.setSpacing(4)

self._cbFoo = QComboBox()
for x in ["ABC", "DEF", "GHI", "JKL"]:
self._cbFoo.addItem(x)

self._leBar = QLineEdit('', self)
lo.addWidget (self._cbFoo, 3)
lo.addSpacing (5)
lo.addWidget (QLabel ( 'Bar:'))
lo.addWidget (self._leBar, 3)
lo.addStretch (5)
self.setLayout (lo)

class Tree(QTreeWidget):
def __init__(self, parent=None):
QTreeWidget.__init__(self, parent)

# Here is the issue?
self.setDragDropMode(QAbstractItemView.InternalMove)
self.installEventFilter(self)
self.setColumnCount(3)
self.dropEvent = self.treeDropEvent

for n in range (2):
i = QTreeWidgetItem (self) # create QTreeWidget the sub i
i.setText (0, "first" + str (n)) # set the text of the first 0
i.setText (1, "second")
for m in range (2):
j = QTreeWidgetItem(i)
j.setText (0, "child first" + str (m))

self.item = InlineEditor(self) # deal with a combination of multiple controls
self.setItemWidget(self.topLevelItem(0).child(1), 1, self.item)

def treeDropEvent(self, event):
dragItem = self.currentItem()

QTreeWidget.dropEvent(self, event)
# rebuild widget (grabbing it doesnt seem to work from self.itemWidget?)
self.item = InlineEditor(self)
self.setItemWidget(dragItem, 1, self.item)

class Form (QDialog):
def __init__(self,parent=None):
QDialog.__init__(self, parent)
grid = QGridLayout ()
tree = Tree ()
grid.addWidget (tree)
self.setLayout (grid)

app = QApplication ([])
form = Form ()
form.show ()
app.exec_ ()

关于python - pyqt QTreeWidget setItemWidget 拖/放后消失,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2383212/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com