我有一个包含QTreeWidget的类(EditorTagManager)。在运行时,树可以包含任意数量的标记项,所有标记项都是可检查的。我正在尝试在QTreeWidgetItem之间添加水平线,以便清楚地表明这些标签是不相关的并且意味着彼此分离(每个项目都是根级节点)。
根据我对这个主题的研究,我发现控制QtreeWidgetItems外观到任何有意义的程度的唯一方法是子类QStyledItemDelegate并将委托绑定到QTreeWidget。这是一种抽象概念,所以我不完全理解它。由于我以前从未使用过Qt对象的子类,因此我不确定我是否正确地执行了此操作。
由于Qt文档没有真正解释如何执行此操作,因此我使用Clementine 1.0.1源代码中的settingsdialog.cpp / .h文件作为我的指南/参考,因为Clementine的首选项窗口在其QTreeWidget上使用类似的分隔符。我正在尝试从Clementine的代码中反向设计我自己的解决方案,唯一的问题是Clementine的实现会做我不需要的事情(所以我必须弄清楚与我的代码有什么关系,什么不是)。这就是让我达到这一点的原因;我的代码与Clementine代码非常相似(我只是更改了委托类名):
这是我在editortreemanager.h中的当前委托头声明:
class TagListDelegate : public QWidget
{
public:
TagListDelegate(QObject* parent);
void paint(QPainter* painter, const QStyleOptionViewItem& option,
const QModelIndex& index) const;
};
这是我在editortreemanager.cpp中的当前委托源:
TagListDelegate::TagListDelegate(QObject *parent) :
TagListDelegate(parent){
}
void TagListDelegate::paint(QPainter *painter, const QStyleOptionViewItem &option,
const QModelIndex &index) const{
}
尽管TagListDelegate :: paint()实际上还没有做任何事情,但我想在尝试更改QTreeWidgetItems的外观之前让这段代码正常工作。我的目标是尽可能简化这一点。
在我告诉QTreeWidget(ui-> AvailableTags)使用委托之前,所有内容都已编译好:
ui->AvailableTags->setItemDelegate(new TagListDelegate(this));
编译器错误显示为:
/home/will/qt_projects/robojournal/ui/editortagmanager.cpp:211:错误: 没有匹配的呼叫功能 'QTreeWidget :: setItemDelegate(TagListDelegate *)'
我在这里有点过头,所以我一定会感谢你帮忙解决这个问题。
更新(2013年7月30日):
My Delegate类现在看起来像这样:
来源:
TagListDelegate::TagListDelegate(QStyledItemDelegate *parent) :
TagListDelegate(parent){
}
void TagListDelegate::paint(QPainter *painter, const QStyleOptionViewItem &option,
const QModelIndex &index) const{
QStyledItemDelegate::paint(painter, option, index);
}
标题声明:
class TagListDelegate : public QStyledItemDelegate
{
public:
TagListDelegate(QStyledItemDelegate* parent);
void paint(QPainter* painter, const QStyleOptionViewItem& option,
const QModelIndex& index) const;
};
更新(2013年7月31日)
以下是我的课程现在的样子:
头:
class TagListDelegate : public QStyledItemDelegate
{
public:
TagListDelegate(QObject* parent);
QSize sizeHint(const QStyleOptionViewItem& option, const QModelIndex& index) const;
void paint(QPainter* painter, const QStyleOptionViewItem& option,
const QModelIndex& index) const;
};
来源:
TagListDelegate::TagListDelegate(QObject *parent)
: TagListDelegate(parent){
}
QSize TagListDelegate::sizeHint(const QStyleOptionViewItem &option, const QModelIndex &index) const
{
QSize ret = QStyledItemDelegate::sizeHint(option, index);
return ret;
}
void TagListDelegate::paint(QPainter *painter, const QStyleOptionViewItem &option,
const QModelIndex &index) const{
QStyledItemDelegate::paint(painter, option, index);
}
答案 0 :(得分:1)
您没有在代码中继承QStyledItemDelegate
。你是QWidget
的子类。
改变
class TagListDelegate : public QWidget
为:
class TagListDelegate : public QStyledItemDelegate
不要忘记包含标题:
#include <QStyledItemDelegate>