问题描述
我正在尝试在 Qt 5.15 中编写一个表模型视图的最小示例。
我从 TableModel
派生出自己的类 QAbstractTableModel
,但链接器抱怨没有该类的 vtable。
完整的 Qt Creator 项目和代码文件在此 GitHub repository 中,但我在此问题的末尾包含了 TableModel
的代码。
/Users/rodrigobraz/Documents/Qt Projects/build-tabledraganddrop-Desktop_Qt_5_15_2_clang_64bit-Debug/mainwindow.o:-1: error: Undefined symbols for architecture x86_64:
"vtable for TableModel",referenced from:
TableModel::TableModel() in mainwindow.o
NOTE: a missing vtable usually means the first non-inline virtual member function has no deFinition.
它说这通常是由未实现的非内联虚拟方法引起的,但我相信 TableModel
正在实现所有纯虚拟方法;
它派生自 QAbstractTableModel
,它没有任何纯虚方法,而它的基类 QAbstractItemModel
确实有四个纯虚方法TableModel
实现。导致错误的原因是什么?
int qabstractitemmodel::rowCount(const QModelIndex &parent = QModelIndex()) const
int qabstractitemmodel::columnCount(const QModelIndex &parent = QModelIndex()) const
QVariant qabstractitemmodel::data(const QModelIndex &index,int role = Qt::displayRole) const
QModelIndex qabstractitemmodel::index(int row,int column,const QModelIndex &parent = QModelIndex()) const
QModelIndex qabstractitemmodel::parent(const QModelIndex &index) const
tablemodel.h
:
#ifndef TABLEMODEL_H
#define TABLEMODEL_H
#include <qabstractitemmodel.h>
#include <qvariant.h>
#include <vector>
using std::vector;
class TableModel : public QAbstractTableModel {
vector<vector<QVariant>> dataList;
QModelIndex index(int row,const QModelIndex &parent = QModelIndex()) const override;
QModelIndex parent(const QModelIndex &child) 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;
};
#endif // TABLEMODEL_H
tablemodel.cpp
:
#include "mainwindow.h"
#include <QAbstractTableModel>
#include <qabstractitemmodel.h>
using std::vector;
class TableModel : public QAbstractTableModel {
vector<vector<QVariant>> dataList{{"Lion","Tiger","Bear"}};
QModelIndex index(int row,const QModelIndex &parent = QModelIndex()) const override {
Q_UNUSED(parent);
return createIndex(row,column);
}
QModelIndex parent(const QModelIndex &child) const override {
Q_UNUSED(child);
return QModelIndex();
}
QVariant virtual data(const QModelIndex &index,int role = Qt::displayRole) const override {
if (role == Qt::displayRole)
return dataList[index.row()][index.column()];
return QVariant();
}
bool setData(const QModelIndex &index,const QVariant &value,int role = Qt::EditRole) override {
Q_UNUSED(role);
dataList[index.row()][index.column()] = value;
emit dataChanged(index,index);
return true;
}
int rowCount(const QModelIndex &parent = QModelIndex()) const override {
Q_UNUSED(parent);
return dataList.size();
}
int columnCount(const QModelIndex &parent = QModelIndex()) const override {
Q_UNUSED(parent);
return 3;
}
Qt::ItemFlags flags(const QModelIndex &index) const override {
Q_UNUSED(index);
return Qt::ItemIsSelectable | Qt::ItemIsEditable | Qt::ItemIsEnabled | Qt::ItemIsDragEnabled | Qt::ItemIsDropEnabled;
}
Qt::DropActions supportedDropActions() const override {
return Qt::copyAction | Qt::MoveAction;
}
};
顺便说一下,我使用的是基于 Qt 5.15.2(Clang 11.0(Apple),64 位)的 Qt Creator 4.14.2。
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)