Правильно реализовать 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>