qt自定义类到QTreeView

时间:2018-11-06 13:47:39

标签: c++ qt

我有一个名为A的自定义类,该类基本上由类型为B的向量组成,其中BA内的私有类。

class A{
public:

explicit A(std::string name): name_{name} {}

void add_item(int i, double d, std::string s){
    list_.emplace_back(i, d, s);
}

private:

    class B{
    public:

        B(int i, double d, std::string s): i_{i}, d_{d}, s_{s} {}

    private:
        int i_;
        double d_;
        std::string s_;
    }

    std::string name_;
    std::vector<B> list_;
}

此类来自另一个未使用QT的项目。也不能在此类文件中包括一些QT头。

我的目标是以某种方式将A类型的对象连接到QTableView。目的是在QTableView中,行与list中的项目和第3列中的项目一样多,其中第一个列出整数(i_)的值,第二个列出整数的值。翻倍(d_),字符串的第三个值(s_)。

应该可以在QTreeView中编辑值,如果我调用add_item(),它应该自动添加一行。

我不太确定如何从这里开始。我经常使用QTableViews,但仅使用QStandardItemModel。

当然,我可以简单地使用QStandardItemModel并将值解析为该模型,但是如果我想在其他函数中使用它,则每次都需要将其转换回类A

我将不胜感激。我敢肯定必须有一种方法可以简单地做到这一点,但我不知道要寻找什么。如果您有用于谷歌搜索的有用链接或关键字,请告诉我。

1 个答案:

答案 0 :(得分:0)

我的解决方案是创建一个从QAbstractTableModel派生的新类并重载函数

QVariant headerData(int section, Qt::Orientation orientation, int role = Qt::DisplayRole) const override;

int rowCount(const QModelIndex &parent = QModelIndex()) const override;

int columnCount(const QModelIndex &parent = QModelIndex()) const override;

QVariant data(const QModelIndex &index, int role = Qt::DisplayRole) const override;

bool setData(const QModelIndex &index, const QVariant &value, int role = Qt::EditRole) override;

Qt::ItemFlags flags(const QModelIndex& index) const override;

bool insertRows(int row, int count, const QModelIndex &parent = QModelIndex()) override;

bool removeRows(int row, int count, const QModelIndex &parent = QModelIndex()) override;

此外,我还必须创建几个额外的Delegate类,它们从QItemDelegate派生并覆盖以下函数:

QWidget *createEditor(QWidget *parent, const QStyleOptionViewItem &option, const QModelIndex &index) const override;

void setEditorData(QWidget *editor, const QModelIndex &index) const override;

void setModelData(QWidget *editor, QAbstractItemModel *model, const QModelIndex &index) const override;

void updateEditorGeometry(QWidget *editor, const QStyleOptionViewItem &option, const QModelIndex &index) const override;