Problema vtable de herencia QAbstractTableModel
-
11-07-2019 - |
Pregunta
Aquí hay otro problema con qt: Extiendo un QAbstractTableModel, pero recibo un error de compilación (estoy usando 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;}
cuando compilo obtengo:
En la función TableModel ':
/partd/unusedsvn/unusedpkg/iface/tableModel.cpp:4: referencia indefinida a
vtable para TableModel '
/partd/unusedsvn/unusedpkg/iface/tableModel.cpp:4: referencia indefinida a vtable para TableModel '
collect2: ld devolvió 1 estado de salida
¿Alguien tiene el mismo problema?
Solución 2
Se resolvió agregar a CMakeLists.txt el archivo cpp necesario.
set(tutorial_SRCS app.cpp mainWin.cpp tableModel.cpp)
Cuando ejecutaré cmake, el moc * se creará automáticamente
Otros consejos
Asegúrese de ejecutar su encabezado a través de MOC y de vincular esos archivos de objetos MOC.
Casi el 100% de los errores de vtable son causados ??por la falta de encabezados / definiciones de clase o por errores tipográficos en esas definiciones, por lo que lo primero que debe hacer es asegurarse de que tiene los encabezados y fuentes correctos (e incluidos en el proyecto). Personalmente maldije a Qt al infierno más bajo por eso y me perdí ese pequeño error tipográfico en el archivo del proyecto, no es divertido :)
Sí, los errores de vtable son una mierda.
Debe implementar el método code (), que también es un método virtual puro.
Del documentación de QAbstractTableModel :
Subclases
Al subclasificar QAbstractTableModel, debe implementar rowCount (), columnCount (), y data () .
También tengo un problema de vtable e implementé data (), así que me falta otra basura virtual, pero no sé cuál.
Este es un error bastante común cuando un el objeto no es moc 'ed . Leí todo el documento de depuración para ahorrarme un poco de tiempo. .
Para resolver este problema, eliminé Q_OBJECT de TableModel, hice una nueva clase TableModelController, que deriva de QObject y tengo TableModel adentro
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;
};
Luego uso TableModelController para acceder a TableModel throw get Methond y las ranuras públicas. Estoy usando QtCreator