Qt - 覆盖 QTreeView::drawBranches()
Qt - Overriding QTreeView::drawBranches()
我想覆盖 QTreeView.
中的函数 drawBranches()
我子 class 编辑了 QTreeView class,然后我从 here 复制了 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;
.
如何在不违反私有角色的情况下获得对该指针的引用?
为什么我要覆盖此功能:我想隐藏所有项目的 expand/collapse 指示器,但 0 级 [=] 除外37=] (height level) 我想通过覆盖这个函数我可以做到这一点。
谢谢
您需要参考 reference on using Qt PIMPL idiom。
每个 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);
...
}
此外,不要从随机存储库中复制代码,您应该复制它 from the official mirror。
我想覆盖 QTreeView.
中的函数 drawBranches()
我子 class 编辑了 QTreeView class,然后我从 here 复制了 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;
.
如何在不违反私有角色的情况下获得对该指针的引用?
为什么我要覆盖此功能:我想隐藏所有项目的 expand/collapse 指示器,但 0 级 [=] 除外37=] (height level) 我想通过覆盖这个函数我可以做到这一点。
谢谢
您需要参考 reference on using Qt PIMPL idiom。
每个 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);
...
}
此外,不要从随机存储库中复制代码,您应该复制它 from the official mirror。