Правильно реализовать QStyledItemDelegate

У меня есть класс (EditorTagManager), который содержит QTreeWidget. Во время выполнения дерево может содержать любое количество элементов тегов, каждый из которых можно проверить. Я пытаюсь добавить горизонтальные линии между QTreeWidgetItems, чтобы прояснить, что эти теги не связаны и должны быть отделены друг от друга (каждый элемент является узлом корневого уровня).

Из моего исследования предмета я выяснил, что единственный способ контролировать внешний вид QtreeWidgetItems в любой значимой степени - это создать подкласс QStyledItemDelegate и связать делегат с QTreeWidget. Это своего рода абстрактное понятие, поэтому я не совсем понимаю его. Поскольку раньше мне никогда не приходилось создавать подкласс объекта Qt, я не уверен, правильно ли я это делаю.

Поскольку документация Qt на самом деле не объясняла, как это сделать, я использовал файлы settingsdialog.cpp/.h из исходного кода Clementine 1.0.1 в качестве руководства / справки, потому что окно настроек Clementine использует аналогичные разделители в своем QTreeWidget. Я пытаюсь реконструировать свое собственное решение из кода Клементины, единственная проблема заключается в том, что реализация Клементины делает то, что мне не нужно (поэтому я должен выяснить, что имеет отношение к моему коду, а что нет). Вот что привело меня к этому моменту; мой код очень похож на код Клементина (я только что изменил имя класса делегата):

Вот мое текущее объявление заголовка делегата в 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*)'

Я немного над головой, поэтому я определенно буду признателен за помощь в выяснении этого.

ОБНОВЛЕНИЕ (30.07.13):

Мой класс 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;
};

ОБНОВЛЕНИЕ (31/31/13)

Вот как сейчас выглядят мои занятия:

заголовок:

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 ответ

Решение

Вы не подкласс QStyledItemDelegate в вашем коде. Вы подкласс QWidget, + Изменить

class TagListDelegate : public QWidget

чтобы:

class TagListDelegate : public QStyledItemDelegate

И не забудьте включить заголовок:

#include <QStyledItemDelegate>
Другие вопросы по тегам