正确实现QStyledItemDelegate

时间:2013-07-29 23:56:29

标签: qt qtreewidget qstyleditemdelegate

我有一个包含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);

}

1 个答案:

答案 0 :(得分:1)

您没有在代码中继承QStyledItemDelegate。你是QWidget的子类。 改变

class TagListDelegate : public QWidget

为:

class TagListDelegate : public QStyledItemDelegate

不要忘记包含标题:

#include <QStyledItemDelegate>