C++ Qt-重写QTreeView::DrawBranchs()
我想覆盖QTreeView中的函数drawBranchs() 我对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
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);
...
}