QAbstractTableModel наследование vtable проблема - PullRequest
0 голосов
/ 27 ноября 2008

Вот еще одна проблема с 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 to vtable для TableModel ' /partd/unusedsvn/unusedpkg/iface/tableModel.cpp:4: неопределенная ссылка на vtable for TableModel' collect2: ld returned 1 exit status

есть ли у кого-нибудь такая же проблема ??

Ответы [ 6 ]

3 голосов
/ 27 ноября 2008

Убедитесь, что вы запускаете свой заголовок через MOC и связываете эти объектные файлы MOC.

0 голосов
/ 14 мая 2018

Чтобы решить эту проблему, я удалил Q_OBJECT из TableModel, создал новый класс 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 и получить Methond и публичные слоты. Я использую QtCreator

0 голосов
/ 19 июня 2010

Да, ошибки vtable - сука.
Вы должны реализовать метод code (), который также является чисто виртуальным методом.

Из документации QAbstractTableModel :

Наследование
При создании подкласса QAbstractTableModel необходимо реализовать rowCount (), columnCount (), и data () .

У меня тоже проблема с vtable, и я реализовал data (), поэтому мне не хватает другого виртуального дерьма, но я не знаю, какой именно.

0 голосов
/ 11 декабря 2008

Это довольно распространенная ошибка, когда объект не перемещен . Я прочитал бы весь документ отладки , чтобы сэкономить время в будущем.

0 голосов
/ 03 декабря 2008

Почти 100% ошибок vtable вызваны либо отсутствующими заголовками / определениями классов, либо опечатками в этих определениях, поэтому первое, что нужно сделать, - убедиться, что вы правильно выбрали заголовки и источники (и включены в проект). Я лично проклинал Qt до чертиков за это и пропустил эту крошечную опечатку в файле проекта, не весело :) 1001 *

0 голосов
/ 02 декабря 2008

Решено добавить в CMakeLists.txt нужный файл cpp.

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

Когда я буду запускать cmake, moc * будет создан автоматически

...