문제

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 toTablemodel '/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를 사용합니다

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top