0

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

// file.h
#ifndef TABLEMODEL_H
#define TABLEMODEL_H

#include <QAbstractTableModel>

class TableModel : public QAbstractTableModel
{
Q_OBJECT

public:
TableModel(QObject *parent = 0);
int rowCount(const QModelIndex &parent = QModelIndex()) const;
int columnCount(const QModelIndex &parent = QModelIndex()) const;
};
#endif

// file.c
#include "tableModel.h"

TableModel::TableModel(QObject *parent)
: QAbstractTableModel(parent){}
int TableModel::rowCount(const QModelIndex & ) const
{ return 1; }

int TableModel::columnCount(const QModelIndex & ) const
{ return 1;}

当我编译时,我得到:

TableModel': /partd/unusedsvn/unusedpkg/iface/tableModel.cpp:4: undefined reference toTableModel' /partd/unusedsvn/unusedpkg/iface/tableModel.cpp:4 的函数 vtable 中:未定义引用vtable for TableModel' collect2: ld returned 1 exit status

有人遇到同样的问题吗??

4

6 回答 6

3

确保您正在通过 MOC 运行您的标头,并且正在链接那些 MOC 目标文件。

于 2008-11-26T21:17:30.160 回答
0

解决了将所需的 cpp 文件添加到 CMakeLists.txt 的问题。

set(tutorial_SRCS app.cpp mainWin.cpp tableModel.cpp)

当我运行 cmake 时,将自动创建 moc*

于 2008-12-02T12:31:25.840 回答
0

几乎 100% 的 vtable 错误是由缺少标头/类定义或这些定义中的拼写错误引起的,因此首先要做的是确保标头和源代码正确(并包含在项目中)。我个人为此诅咒Qt到最低的地狱,并错过了项目文件中的那个小错字,不好玩:)

于 2008-12-03T19:01:38.377 回答
0

是的,vtable 错误是个婊子。
你必须实现 code() 方法,它也是一个纯虚方法。

QAbstractTableModel 文档

子类
化 子类化 QAbstractTableModel 时,您必须实现 rowCount()、columnCount()和 data()

我也有一个 vtable 问题,我实现了 data(),所以我错过了其他虚拟废话,但我不知道是哪一个。

于 2010-06-18T20:41:44.583 回答
-1

当一个对象没有被 moc'ed时,这是一个相当常见的错误。我会阅读整个调试文档以节省一些时间。

于 2008-12-11T02:43:34.460 回答
-1

为了解决这个问题,我从 TableModel 中删除了 Q_OBJECT,创建了新的类 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 Methond 和公共插槽。我正在使用 QtCreator

于 2018-05-14T17:27:57.047 回答