C++ QAbstractTableModel继承vtable问题

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

qt还有一个问题: 我扩展了QAbstractTableModel,但出现了编译错误(我使用的是cmake)

//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;
};