C++ Qt-重写QTreeView::DrawBranchs()

C++ Qt-重写QTreeView::DrawBranchs(),c++,qt,overriding,qtreeview,C++,Qt,Overriding,Qtreeview,我想覆盖QTreeView中的函数drawBranchs() 我对QTreeView类进行了子类化,然后从中复制了drawBranchs()函数。在更改此函数中的任何内容之前,我想确保它首先工作,但生成失败,出现以下错误: error: 'const QTreeViewPrivate* QTreeView::d_func() const' is private inline const Class##Private* d_func() const { return reinterpret_ca

我想覆盖QTreeView中的函数drawBranchs() 我对QTreeView类进行了子类化,然后从中复制了drawBranchs()函数。在更改此函数中的任何内容之前,我想确保它首先工作,但生成失败,出现以下错误:

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)); } \
})

有许多行使用了d指针,并且是私有的,例如
d->indent

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

我为什么要覆盖此函数:我想隐藏所有项目的展开/折叠指示器,除了那些级别为零的项目(高度级别),我想通过覆盖此函数,我可以做到这一点


谢谢

您需要咨询

每个
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;
};
//接口
#包括
类MyTreeView:公共QTreeView
{
Q_对象
Q_DECLARE_PRIVATE(QTreeView)
公众:
MyTreeView(QWidget*parent={}):QTreeView{parent}{}
受保护的:
无效支路(QPainter*、常数QRect和、常数QModelIndex和)常数覆盖;
};
//实现
#包括
void MyTreeView::drawBranchs(画师*painter,常量QRect&rect,常量
QModelIndex和index)常数
{
Q_D(常数QTreeView);
...
}

另外,您应该复制随机存储库中的代码,而不是从随机存储库中复制代码。

感谢您的响应和提示:“来自官方镜像”。我对QT+=gui private有一个问题,它拒绝包含,但我想我可以解决。添加QT+=widgets private而不是gui private让它工作起来
// 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);
  ...
}