qt - 正确实现 QStyledItemDelegate

标签 qt qtreewidget qstyleditemdelegate

我有一个包含 QTreeWidget 的类 (EditorTagManager)。在运行时,树可以包含任意数量的标记项,所有这些标记项都是可检查的。我试图在 QTreeWidgetItems 之间添加水平线,以便清楚地表明这些标签是不相关的,并且应该彼此分开(每个项目都是根级节点)。

根据我对这个主题的研究,我发现控制 QtreeWidgetItems 的外观到任何有意义的程度的唯一方法是子类化 QStyledItemDelegate 并将委托(delegate)绑定(bind)到 QTreeWidget。这是一个抽象的概念,所以我不能完全理解它。因为我以前从未需要子类化 Qt 对象,所以我不确定我是否做得正确。

由于 Qt 文档并未真正解释如何执行此操作,因此我使用 Clementine 1.0.1 源代码中的 settingsdialog.cpp/.h 文件作为我的指南/引用,因为 Clementine 的首选项窗口在其 QTreeWidget 上使用类似的分隔符。我正在尝试从 Clementine 的代码对我自己的解决方案进行逆向工程,唯一的问题是 Clementine 的实现做了我不需要的事情(所以我必须弄清楚什么与我的代码相关,什么不相关)。这就是让我走到这一步的原因;我的代码与 Clementine 代码非常相似(我只是更改了委托(delegate)类名称):

这是我当前在 editortreemanager.h 中的委托(delegate) header 声明:

class TagListDelegate : public QWidget
{

public:
    TagListDelegate(QObject* parent);
    void paint(QPainter* painter, const QStyleOptionViewItem& option,
                const QModelIndex& index) const;
};

这是我当前在 editortreemanager.cpp 中的委托(delegate)源代码:

TagListDelegate::TagListDelegate(QObject *parent) :
    TagListDelegate(parent){

}

void TagListDelegate::paint(QPainter *painter, const QStyleOptionViewItem &option,
                            const QModelIndex &index) const{

}

尽管 TagListDelegate::paint() 实际上还没有执行任何操作,但我只想在尝试更改 QTreeWidgetItems 的外观之前让此代码正常工作。我的目标是暂时使其尽可能简单。

一切都编译得很好,直到我告诉 QTreeWidget (ui->AvailableTags) 使用委托(delegate):

ui->AvailableTags->setItemDelegate(new TagListDelegate(this)); 

编译器错误如下:

/home/will/qt_projects/robojournal/ui/editortagmanager.cpp:211: error: no matching function for call to 'QTreeWidget::setItemDelegate(TagListDelegate*)'

我有点不知所措,所以我非常希望能得到一些帮助来解决这个问题。

更新(2013 年 7 月 30 日):

我的委托(delegate)类现在看起来像这样:

来源:

TagListDelegate::TagListDelegate(QStyledItemDelegate *parent) :
    TagListDelegate(parent){

}

void TagListDelegate::paint(QPainter *painter, const QStyleOptionViewItem &option,
                            const QModelIndex &index) const{

    QStyledItemDelegate::paint(painter, option, index);

}

header 声明:

class TagListDelegate : public QStyledItemDelegate
{

public:
    TagListDelegate(QStyledItemDelegate* parent);
    void paint(QPainter* painter, const QStyleOptionViewItem& option,
                const QModelIndex& index) const;
};

更新(2013 年 7 月 31 日)

这是我的类(class)现在的样子:

标题:

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);

}

最佳答案

您没有在代码中对 QStyledItemDelegate 进行子类化。您正在对 QWidget 进行子类化。 改变

class TagListDelegate : public QWidget

至:

class TagListDelegate : public QStyledItemDelegate

并且不要忘记包含标题:

#include <QStyledItemDelegate>

关于qt - 正确实现 QStyledItemDelegate,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17936185/

相关文章:

c++ - 智能指针作为 QObject::deleteLater() 的替代品

linux - Linux 上的 Qt 4.8.3 GUI 应用程序看起来很旧并且与设计器预览不匹配

c++ - 将子项目插入一行 QTreeWidgetItem

python - QTreeWidget中拖动时如何隐藏屏幕截图后再释放?

python - 如何连接到列代表的信号

c++ - QStyledItemDelegate 部分选择默认 QLineEdit 编辑器的文本

c++ - 使用 QStyledItemDelegate 调整 QStandardItem 的选择行为

c++ - 使用带有接口(interface)和新语法的 Qt 连接时出错

mysql - QT5.2为什么没有加载QMYSQL驱动?

c++ - 如何在QTreeWidget子项上正确显示QIcon?