QTreeView绘制拖放指示器,自定义拖拽样式,拖放样式

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()));

评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值