QABSTRANTTABLEMODEL 상속 vtable 문제
-
11-07-2019 - |
문제
QT의 또 다른 문제는 다음과 같습니다. QABSTRATTTABLEMODEL을 확장하지만 컴파일 오류가 발생합니다 (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
Tablemodel '/partd/unusedsvn/unuidspkg/iface/tablemodel.cpp:4 용 Vtable : 정의되지 않은 참조 vtable for TableModel'
collect2: ld returned 1 exit status
누구든지 같은 문제가 있습니까?
해결책 2
cmakelists.txt에 추가 된 CPP 파일을 추가했습니다.
set(tutorial_SRCS app.cpp mainWin.cpp tableModel.cpp)
CMAKE를 실행하면 MOC*가 자동으로 생성됩니다.
다른 팁
MOC를 통해 헤더를 실행하고 MOC 객체 파일을 연결하고 있는지 확인하십시오.
Vtable 오류의 거의 100%%가 누락 된 헤더/클래스 정의 또는 해당 정의의 Typoes에 의해 발생하므로, 가장 먼저해야 할 일은 헤더와 소스를 올바르게 (및 프로젝트에 포함 시키면) 확인하는 것입니다. 나는 개인적으로 QT를 그에게 가장 낮은 지옥으로 저주했고 프로젝트 파일의 작은 오타를 놓쳤다. :)
예, vtable 오류는 암캐입니다.
순수한 가상 메소드 인 Code () 메소드도 구현해야합니다.
로부터 QABSTRANTTABLEMODEL 문서 :
서브 클래싱
서브 클래스 QABSTRANTTABLEMODEL을 할 때는 rowCount (), collectCount ()를 구현해야합니다. 그리고 data ().
나도 Vtable 문제가 있고 Data ()를 구현 했으므로 다른 가상 쓰레기가 누락되었지만 Whitch One을 모릅니다.
이것은 an 때 상당히 일반적인 버그입니다 객체는 moc'ed가 아닙니다. 나는 전체를 읽었습니다 디버깅 문서 시간을 절약하기 위해 길을 따라 내려갑니다.
이 문제를 해결하기 위해 Tablemodel에서 q_object를 제거하고 Qobject에서 파생 된 새로운 클래스 TablemodelController를 만들고 내부에 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에 액세스하는 데 메 톤 및 공개 슬롯에 액세스합니다. QTCreator를 사용합니다