QT QTreeView/QTreeWidget 自带拖放指示器样式不是很明显,我想让拖放指示器明显一些,找了好久没有相关资料。
最终通过各种百度,各种关键字查找(QTreeView 美化,QTreeView 样式,QTreeView 自绘,QTreeView QSS),各种查看源码。最终实现如图效果。
QTreeWidget应该也可以使用的。
Qt就是好啊。遇到问题可以查看源码。然后通过源码找到解决方案。或者找到搜索关键字。
我这边继承了QTreeview。实现了一些自绘效果。旁边三个按钮是通过QStyledItemDelegate绘制的。
class CNodeTreeView : public QTreeView {
Q_OBJECT
public:
explicit CNodeTreeView(QWidget *parent = nullptr);
// 绘制下箭头
virtual void drawBranches(QPainter* painter,
const QRect& rect,
const QModelIndex& index) const override;
// 绘制竖线
virtual void paintEvent(QPaintEvent *event) override;
// 绘制item之间的分割线
virtual void drawRow(QPainter *painter, const QStyleOptionViewItem &option,
const QModelIndex &index) const override;
};
下面是绘制拖放样式的代码部分。
class myViewStyle: public QProxyStyle {
public:
myViewStyle(QStyle* style = 0);
void drawPrimitive ( PrimitiveElement element, const QStyleOption * option, QPainter * painter, const QWidget * widget = 0 ) const;
};
myViewStyle::myViewStyle(QStyle* style)
:QProxyStyle(style)
{}
void myViewStyle::drawPrimitive ( PrimitiveElement element, const QStyleOption * option, QPainter * painter, const QWidget * widget) const{
if (element == QStyle::PE_IndicatorItemViewItemDrop && !option->rect.isNull()){
QRect rect = option->rect;
QPen pen;
pen.setColor(QColorConstants::DarkCyan);
pen.setWidth(2);
painter->setPen(pen);
painter->setRenderHint(QPainter::Antialiasing);
if (option->rect.height() == 0) {
painter->drawEllipse(QPoint(10, option->rect.top()), 4, 4);
painter->drawLine(QPoint(10, rect.top()), QPoint(widget->width() - 10, rect.top()));
}
else {
rect.setLeft(5);
rect.setRight(widget->width() - 5);
painter->drawRect(rect);
}
return;
}
QProxyStyle::drawPrimitive(element, option, painter, widget);
}
// treeview调用
treeview->setStyle(new myViewStyle(style()));