我正在尝试覆盖当项目被拖动到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()发布于 2011-01-21 12:05:32
这很容易通过使用c++的qt来解决:只要通过元素参数接收到QStyle::PE_IndicatorItemViewItemDrop常量,你就可以定义一个新的样式,覆盖drawPrimitive方法,并在那里进行自定义绘制(或者什么都不做)。下面是一个示例:
class TestStyle : public QProxyStyle
{
public:
TestStyle(QStyle *baseStyle = 0) : QProxyStyle(baseStyle) {}
void drawPrimitive(PrimitiveElement element, const QStyleOption *option, QPainter *painter, const QWidget *widget) const
{
if (element == QStyle::PE_IndicatorItemViewItemDrop)
{
//?? do nothing or do custom painting here
}
else
{
QProxyStyle::drawPrimitive(element, option, painter, widget);
}
}
};
..
ui->treeView->setStyle(new TestStyle(ui->treeView->style()));现在坏消息是,pyqt似乎对QProxyStyle一无所知;看起来它没有包装在那里,所以为了让它工作,您需要自己包装样式类。
另一种解决方案是创建一个自定义的QTreeView后代并覆盖它的paintEvent方法。默认实现是调用drawTree和paintDropIndicator;其中paintDropIndicator负责拖放指示器,drawTree呈现树项目。drawTree是受保护的,可供您从paintEvent调用:
class TestTreeView : public QTreeView
{
public:
explicit TestTreeView(QWidget *parent = 0) : QTreeView(parent) {}
void paintEvent(QPaintEvent * event)
{
QPainter painter(viewport());
drawTree(&painter, event->region());
}
};这应该会抑制默认的拖放指示器。如果您在将其转换为python时遇到问题,请告诉我。
希望这能有所帮助,致敬
https://stackoverflow.com/questions/4754500
复制相似问题