Question

Voici un autre problème avec qt: J'étends un QAbstractTableModel, mais je reçois une erreur de compilation (j'utilise 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;}

quand je compile, je reçois:

Dans la fonction TableModel ': /partd/unusedsvn/unusedpkg/iface/tableModel.cpp:4: référence indéfinie à vtable pour TableModel ' /partd/unusedsvn/unusedpkg/iface/tableModel.cpp:4: référence non définie à vtable pour TableModel ' collect2: ld a renvoyé 1 état de sortie

Quelqu'un at-il eu le même problème ??

Était-ce utile?

La solution 2

Résolution de l'ajout à CMakeLists.txt du fichier cpp nécessaire.

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

Quand je lancerai cmake, le moc * sera automatiquement créé

Autres conseils

Assurez-vous que vous exécutez votre en-tête via MOC et que vous liez ces fichiers d'objet MOC.

Presque 100% des erreurs vtable sont causées par des définitions d'en-tête / classe manquantes ou par des typos dans ces définitions. La première chose à faire est donc de vous assurer que les en-têtes et les sources sont corrects (et inclus dans le projet). J'ai personnellement maudit Qt au plus bas pour ça et j'ai manqué cette petite faute de frappe dans le fichier de projet, pas amusant:)

Oui, les erreurs vtable sont une chienne.
Vous devez implémenter la méthode code (), qui est également une méthode virtuelle pure.

Extrait de la documentation sur QAbstractTableModel :

  

Sous-classement
  Lorsque vous sous-classez QAbstractTableModel, vous devez implémenter rowCount (), columnCount (), et data () .

J'ai aussi un problème avec vtable, et j'ai implémenté data (). Il me manque donc d'autres conneries virtuelles, mais je ne sais pas qui en est un.

C’est un bug assez courant lorsqu'un objet n'est pas moc 'ed . Je lisais le document de débogage dans son intégralité pour vous faire gagner du temps. .

Pour résoudre ce problème, j'ai supprimé Q_OBJECT de TableModel, créé une nouvelle classe TableModelController, dérivée de QObject et contenant TableModel à l'intérieur

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

Ensuite, j'utilise TableModelController pour accéder à TableModel et obtenir les emplacements Methond et publics. J'utilise QtCreator

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top