QTreeView自定义列

时间:2013-11-16 01:57:07

标签: c++ qt

我需要QFileSystemModel中的QTreeView显示文件,并自定义该树以显示另一列QCheckBox,因此用户可以从QTreeView中选择0..N文件}。 我从Qt阅读文档以了解模型/视图架构,我现在在我的代码中,我有特定列的自定义委托CustomItemDelegate,但实际上我不知道如何创建QCheckBox在我的自定义委托的paint方法中(更具体地说,我知道如何,但这是99%的坏方法)。

customitemdelegate.h

#ifndef CUSTOMITEMDELEGATE_H
#define CUSTOMITEMDELEGATE_H

#include <QStyledItemDelegate>

class CustomItemDelegate : public QStyledItemDelegate
{
    Q_OBJECT
public:
    explicit CustomItemDelegate(QObject *parent = 0);
    void paint(QPainter * painter, const QStyleOptionViewItem & option, const QModelIndex & index) const;

signals:

public slots:

};

#endif // CUSTOMITEMDELEGATE_H

customitemdelegate.cpp

#include "customitemdelegate.h"
#include <QCheckBox>
#include <iostream>
#include <QTreeView>

using namespace std;

CustomItemDelegate::CustomItemDelegate(QObject *parent) :
    QStyledItemDelegate(parent)
{
}

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

     ((QTreeView *)parent())->setIndexWidget(index, new QCheckBox());

 }

1 个答案:

答案 0 :(得分:0)

您不使用当前样式创建QCheckbox绘制。查看有关QStyle的{​​{3}},特别是drawControl(..)。还有我在SO上为docs编写的一个自定义示例,您可以从中获得一个想法。

鼠标处理必须由视图处理(因为控件实际上不存在),并且对于大多数包含鼠标悬停更新的样式。

这有点痛苦(在v5.0 +中,事情可能变得更容易了,我最后在v4.8中做到了这一点),但它非常值得。创建“真正的”QCheckBox是低效的(在您的示例中,它将导致大量内存泄漏),并且对于大型数据集变得明显变慢。而只有在需要时(即可见)才能画出“假的”非常快。