Qt - Overriding QTreeView::drawBranches()

Qt - Overriding QTreeView::drawBranches()

本文关键字:drawBranches QTreeView Overriding Qt      更新时间:2023-10-16

我想覆盖QTreeView
中的函数drawBranches((。我子类化了QTreeView类,然后从这里复制了drawBranches((函数。在更改此函数中的任何内容之前,我想确保它首先工作,但构建失败并出现此错误:

error: 'const QTreeViewPrivate* QTreeView::d_func() const' is private
 inline const Class##Private* d_func() const { return reinterpret_cast<const Class##Private *>(qGetPtrHelper(d_ptr)); } 

这是我的代码:

class MyTreeView : public QTreeView
{
    Q_OBJECT
public:
    MyTreeView(QWidget *parent =0) : QTreeView(parent) {}
    void drawBranches(QPainter * painter, const QRect &rect, const 
                        QModelIndex &index)const
    {
        Q_D(const QTreeView);
        const bool reverse = isRightToLeft();
        const int indent = d->indent;
        const int outer = d->rootDecoration ? 0 : 1;
        const int item = d->current;
        const QTreeViewItem &viewItem = d->viewItems.at(item);
        int level = viewItem.level;
        QRect primitive(reverse ? rect.left() : rect.right() + 1, rect.top(), indent, rect.height());
        ....// Moore lines that I copied
            else
                opt.state &= ~QStyle::State_MouseOver;
            style()->drawPrimitive(QStyle::PE_IndicatorBranch, &opt, painter, this);
            current = ancestor;
            ancestor = current.parent();
        }
        painter->setBrushOrigin(oldBO);
}

};

有很多行使用 d 指针,它是私有的,例如 d->indent;

如何在不违反私有角色的情况下获取对此指针的引用?

为什么我想覆盖这个函数

:我想隐藏除那些具有级(高度级别(的项目之外的所有项目的展开/折叠指示器,我想通过覆盖这个函数我可以做到这一点。

谢谢

您需要查阅有关使用 Qt PIMPL 习语的参考资料。

每个d_func都是私密的。您需要声明自己的。你的是一个特例,因为你不是从QTreeViewPrivate派生的,所以返回的类型仍然是QTreeViewPrivate*的。Qt提供了一个方便的宏来为你完成工作:

// Interface
#include <QTreeView>
class MyTreeView : public QTreeView
{
  Q_OBJECT
  Q_DECLARE_PRIVATE(QTreeView)
public:
  MyTreeView(QWidget * parent = {}) : QTreeView{parent} {}
protected:
  void drawBranches(QPainter *, const QRect &, const QModelIndex&) const override;
};
// Implementation
#include <private/qtreeview_p.h>
void MyTreeView::drawBranches(QPainter * painter, const QRect &rect, const 
                              QModelIndex &index)const
{
  Q_D(const QTreeView);
  ...
}

此外,您应该从官方镜像复制代码,而不是从随机存储库复制代码。