【问题标题】:QTreeView custom columnQTreeView 自定义列
【发布时间】:2013-11-16 17:22:07
【问题描述】:

我需要在QTreeView 中显示来自QFileSystemModel 的文件并自定义该树以使用QCheckBox 再显示一列,因此用户可以从该QTreeView 中选择0..N 个文件。 我从 Qt 阅读了文档以了解模型/视图架构,现在我在我的代码中,我有自定义委托 CustomItemDelegatefor 特定列,但实际上我不知道如何在绘制方法中创建 QCheckBox我的自定义委托(更具体地说,我知道如何,但这是 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());

 }

【问题讨论】:

    标签: c++ qt


    【解决方案1】:

    你没有创建QCheckbox,你绘制一个使用当前样式的。查看关于QStyledocs,特别是drawControl(..)。还有一个我为 SO 上的 question 编写的自定义示例,您可以从中获得一些想法。

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

    这有点痛苦(在 v5.0+ 中事情可能变得更容易,我上次在 v4.8 中这样做了),但这是值得的。创建“真实”QCheckBoxs 效率低下(在您的示例中,它会导致 大量 内存泄漏),并且对于大型数据集来说变得明显变慢。而仅在需要时(即可见)绘制一个“假”是非常快的。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-05-06
      • 2013-06-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-06-26
      • 2016-06-06
      相关资源
      最近更新 更多