QAbstractTableModel継承vtable問題
-
11-07-2019 - |
質問
qtの別の問題: QAbstractTableModelを拡張しますが、コンパイルエラーが発生します(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:TableModelのvtableへの未定義の参照
/partd/unusedsvn/unusedpkg/iface/tableModel.cpp:4:TableModelの vtableへの未定義の参照 '
collect2:ldが1つの終了ステータスを返しました
誰かが同じ問題を抱えていますか?
解決 2
必要なcppファイルをCMakeLists.txtに追加することで解決しました。
set(tutorial_SRCS app.cpp mainWin.cpp tableModel.cpp)
cmakeを実行すると、moc *が自動的に作成されます
他のヒント
MOCを介してヘッダーを実行し、それらのMOCオブジェクトファイルをリンクしていることを確認してください。
vtableエラーのほぼ100%は、ヘッダー/クラス定義の欠落またはそれらの定義のタイプミスのいずれかが原因であるため、最初に行うことは、ヘッダーとソースが正しいこと(およびプロジェクトに含まれていること)を確認することです。私は個人的にQtを最低レベルまで呪い、プロジェクトファイルの小さなタイプミスを逃しましたが、楽しみではありません:)
はい、vtableエラーはめったにありません。
純粋な仮想メソッドでもあるcode()メソッドを実装する必要があります。
サブクラス化
QAbstractTableModelをサブクラス化する場合、rowCount()、columnCount()、およびdata()を実装する必要があります。
vtableの問題もあり、data()を実装したので、他の仮想がらくたは見当たりませんが、それがどこにあるのかわかりません。
オブジェクトがmocでない場合、これはかなり一般的なバグです。 。 ドキュメントのデバッグを読んで、時間を節約してください。
この問題を解決するために、TableModelからQ_OBJECTを削除し、QObjectから派生し、TableModelを内部に持つ新しいクラスTableModelControllerを作成しました
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 get Methondおよびpublicスロットにアクセスします。 QtCreatorを使用しています