【发布时间】:2011-01-21 01:16:33
【问题描述】:
当一个项目被拖到 QTreeWidgetItems 上方时,我试图覆盖它们的绘制方式。我已经覆盖了拖动事件,将我想要绘制的 QTreeWidgetItems 的 Qt.UserRole 数据设置为 1。在 Item Delegate 中,我阅读了 UserRole 并进行了相应的绘制。
我的自定义绘画完全按预期显示(即粗线);但是,我无法弄清楚如何在不抑制所有其他绘画(即文本等)的情况下抑制标准画家为拖动(即小矩形)所做的绘图。
任何想法都将不胜感激。
例如
def dragMoveEvent(self, event):
pos = event.pos()
item = self.myTreeWidget.itemAt(pos)
# If hovered over an item during drag, set UserRole = 1
if item:
index = self.myTreeWidget.indexFromItem(item)
self.myTreeWidget.model().setData(index, 1, Qt.UserRole)
# reset UserRole to 0 for all other indices
for i in range(self.myTreeWidget.model().rowCount()):
_index = self.myTreeWidget.model().index(i, 0)
if not item or index != _index:
self.myTreeWidget.model().setData(_index, 0, Qt.UserRole)
class MyDelegate(QStyledItemDelegate):
def paint( self, painter, option, index ):
QStyledItemDelegate.paint(self, painter, option, index)
painter.save()
data = index.model().data( index, Qt.UserRole ).toInt()
# if UserRole = 1 draw custom line
if data[1] and data[0] == 1:
line = QLine( option.rect.topLeft(), option.rect.topRight() )
painter.drawLine( line )
painter.restore()
【问题讨论】:
-
接管(文本等)的渲染可能比试图弄清楚如何覆盖标准渲染的部分花费更少的精力。