Qt - Overriding QTreeView::drawBranches()
Qt - Overriding QTreeView::drawBranches()
我想覆盖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);
...
}
此外,您应该从官方镜像复制代码,而不是从随机存储库复制代码。
相关文章:
- Qt VTK交互风格的信号到小部件
- QT在错误的班级中寻找空位
- 如何在选项卡视图Qt中设置一个新项目,并保存以前的项目
- 如何在Qt窗口小部件中使用QStringView(或QStringRef)
- 如何在Qt C++中更改光标
- 如何在MS Visual Studio 2019中运行QT UI
- QT通过C++添加映射QML项目
- libssh 的函数在构建 libssh 时无法在 Qt 和 cmake 错误中找到
- 如何将点击的信号和插槽添加到qt中的自定义按钮中
- Qt C++静态thread_local QNetworkAccessManager是线程应用程序的好选择吗
- 使用Qt C++计算类似Git的SHA1哈希
- Qt focusObjectChanged example?
- 如何在cpp文件之间切换窗口?在Qt中
- Qt和C++:将QLineEdit添加到QTabWidget中
- 从数据库实时显示QT c++中的数据
- Qt Quick-如何仅从c++代码与qml属性交互
- 无法使用Qt Creator在Windows中构建yaml-cpp
- 如何在Qt中取消捕获字符串
- Qt SQLite没有查询或参数计数不匹配
- Qt - Overriding QTreeView::drawBranches()