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?

¿Fue útil?

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

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top