我需要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());
}
答案 0 :(得分:0)
您不使用当前样式创建QCheckbox
,绘制。查看有关QStyle
的{{3}},特别是drawControl(..)
。还有我在SO上为docs编写的一个自定义示例,您可以从中获得一个想法。
鼠标处理必须由视图处理(因为控件实际上不存在),并且对于大多数包含鼠标悬停更新的样式。
这有点痛苦(在v5.0 +中,事情可能变得更容易了,我最后在v4.8中做到了这一点),但它非常值得。创建“真正的”QCheckBox
是低效的(在您的示例中,它将导致大量内存泄漏),并且对于大型数据集变得明显变慢。而只有在需要时(即可见)才能画出“假的”非常快。