C++ QAbstractTableModel继承vtable问题
qt还有一个问题: 我扩展了QAbstractTableModel,但出现了编译错误(我使用的是cmake)C++ QAbstractTableModel继承vtable问题,c++,qt,inheritance,cmake,vtable,C++,Qt,Inheritance,Cmake,Vtable,qt还有一个问题: 我扩展了QAbstractTableModel,但出现了编译错误(我使用的是cmake) //file.h #ifndef表格模型 #定义表格模型 #包括 类TableModel:公共QAbstractTableModel { Q_对象 公众: TableModel(QObject*parent=0); int rowCount(常量QModelIndex&parent=QModelIndex())常量; int columnCount(常量QModelIndex&paren
//file.h
#ifndef表格模型
#定义表格模型
#包括
类TableModel:公共QAbstractTableModel
{
Q_对象
公众:
TableModel(QObject*parent=0);
int rowCount(常量QModelIndex&parent=QModelIndex())常量;
int columnCount(常量QModelIndex&parent=QModelIndex())常量;
};
#恩迪夫
//文件.c
#包括“tableModel.h”
TableModel::TableModel(QObject*父对象)
:QAbstractTableModel(父项){}
int TableModel::行计数(常量QModelIndex&)常量
{返回1;}
int TableModel::columnCount(常量QModelIndex&)常量
{返回1;}
当我编译时,我得到:
在函数TableModel'中:
/partd/unusedsvn/unusedpkg/iface/tableModel.cpp:4:tableModel的未定义引用
vtable'
/partd/unusedsvn/unusedpkg/iface/tableModel.cpp:4:tableModel的vtable的未定义引用
collect2:ld返回1个退出状态
是否有人遇到过同样的问题???请确保您正在通过MOC运行标题,并链接这些MOC对象文件。解决了将所需的cpp文件添加到CMakeLists.txt的问题
set(tutorial_SRCS app.cpp mainWin.cpp tableModel.cpp)
当我运行cmake时,moc*将自动创建几乎100%的vtable错误是由于缺少标题/类定义或这些定义中的键入错误造成的,因此首先要做的是确保标题和源正确(并包含在项目中)。我个人为此诅咒了Qt,并错过了项目文件中的那个小错误,这一点都不好玩:)这是一个非常常见的错误。我会通读整本书以节省你今后的时间。是的,vtable错误很糟糕。
您必须实现code()方法,它也是一个纯虚拟方法 从: 子类化
当子类化QAbstractTableModel时,必须实现rowCount()、columnCount()、和data()
我也有一个vtable问题,我实现了data(),所以我缺少了其他虚拟垃圾,但我不知道是哪一个。为了解决这个问题,我从TableModel中删除了Q_对象,创建了新的类TableModelController,该类派生自QObject,内部有TableModel
class TableModel : public QAbstractTableModel
{
public:
TableModel(QObject *parent = 0);
// Some overrided functions
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;
};
class TableModelController : public QObject
{
Q_OBJECT
public:
explicit TableModelController(QObject *parent = nullptr);
TableModelController(TableModel *m, QObject *parent = nullptr);
TableModel *getModel() {
return model;
}
public slots:
void addRow();
void deleteRows();
private:
TableModel *model;
};
然后,我使用TableModelController访问TableModel throw get Method和公共插槽。我很高兴这确实是答案。使用QMake,您必须将标题添加到HEADERS变量,但我不知道cmake。这是如何在QT creator上实现的?@Petruza,我不知道,因为我没有使用QT creator。如果你可以编辑你的qmake(.pro)文件,我会先检查一下。这是如何在QT creator中实现的?解决方案是什么?文件说这是一个常见问题,但没有解决办法
class TableModel : public QAbstractTableModel
{
public:
TableModel(QObject *parent = 0);
// Some overrided functions
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;
};
class TableModelController : public QObject
{
Q_OBJECT
public:
explicit TableModelController(QObject *parent = nullptr);
TableModelController(TableModel *m, QObject *parent = nullptr);
TableModel *getModel() {
return model;
}
public slots:
void addRow();
void deleteRows();
private:
TableModel *model;
};