我有一个名为A
的自定义类,该类基本上由类型为B
的向量组成,其中B
是A
内的私有类。
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
。
我将不胜感激。我敢肯定必须有一种方法可以简单地做到这一点,但我不知道要寻找什么。如果您有用于谷歌搜索的有用链接或关键字,请告诉我。
答案 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;