当鼠标悬停在项目上或项目之间时,显示不同颜色的拖放突出显示

Posted

技术标签:

【中文标题】当鼠标悬停在项目上或项目之间时,显示不同颜色的拖放突出显示【英文标题】:Show different color of drag and drop highlight when mouse is over or between items 【发布时间】:2018-06-05 14:06:35 【问题描述】:

在我的ProxyStyle 类中,我有一个drawPrimitive 函数,当用户在我的TreeView 中拖放项目时,我检查element == QtWidgets.QStyle.PE_IndicatorItemViewItemDrop 是否画一条绿线。

我设置了动作,以便项目可以放在中间但不能结束。所以我想像这样改变高光的颜色: 1- 项目绿色之间的线(水平线) 2- 项目红色上方的行(这条线包裹项目)。

你知道怎么做吗?我的drawPrimitive 函数有这些参数:

element(str)
option (QtGui.QStyleOptionViewItem)
painter(QtGui.QPainter)
widget (QtWidgets.QWidget)

是否有像 PE_IndicatorItemViewItemDrop 这样的标志来指示物品是否会被丢弃?

【问题讨论】:

小部件是否已经显示突出显示,而您只想更改颜色? 是的,除了颜色不变,一切正常 【参考方案1】:

根据github上Qt的5.11分支的最新消息,测试是一个简单的高度等于0:

case PE_IndicatorItemViewItemDrop: 
    QRect rect = opt->rect;
    if (opt->rect.height() == 0)
        p->drawLine(rect.topLeft(), rect.topRight());
    else
        p->drawRect(rect);
    break; 

您的代码应该使用相同的测试来决定使用哪种颜色。如果option.rect.height == 0Qt::green 否则Qt::red。复制当前 QPen 并更改其颜色,然后调用基类的 drawPrimitive。下面的伪代码就足够了:

lastPen = painter.pen()
myPen = QtGui.QPen(lastPen)
if (option.rect.height() == 0):
    myPen.setColor(Qt.green)
else:
    myPen.setColor(Qt.red)
painter.setPen(myPen)
QProxyStyle.drawPrimitive(self, element, option, painter, widget)
painter.setPen(pen)

对不起,如果代码丑陋。我不知道 PySide,只知道 C++ Qt。

【讨论】:

以上是关于当鼠标悬停在项目上或项目之间时,显示不同颜色的拖放突出显示的主要内容,如果未能解决你的问题,请参考以下文章

如何在从另一个小部件拖放事件期间突出显示表格单元格

上传文件时检测到取消的拖放操作

使用对象时如何在鼠标悬停时更改 SVG 笔触颜色

H5的拖放事件(拖拽删除)

「萌新上手Mac」关于MacBook拖放技巧

在 html 选择中悬停或选择项目时,如何避免更改背景颜色?