我对 C++ 和 Qt Framework 比较陌生。我尝试使用派生自 QAbstractListModel 的自定义模型来实现一个简单的 QTableView。
如果我打电话
model->appendRow("Test");
在我的主应用程序中,一切正常。但是,如果我调用
table->model()->appendRow("Test");
我收到以下构建错误:
'class QAbstractItemModel' has no member named 'appendRow'
table->model()->appendRow("Test");
^
我错过了什么?
源代码:
main.c
#include <QApplication>
#include <QTableView>
#include "exercises.h"
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
QTableView *table = new QTableView();
exercisesModel *model = new exercisesModel();
table->setModel(model);
model->appendRow("Test"); //why does this work...
table->model()->appendRow("Test"); //...and this doesn't?
table->show();
return a.exec();
}
练习.h
#ifndef EXERCISES_H
#define EXERCISES_H
#include <QWidget>
#include <QAbstractListModel>
class exercisesModel : public QAbstractListModel
{
public:
exercisesModel(QObject *parent = 0);
int rowCount(const QModelIndex &parent) const;
QVariant data(const QModelIndex &index, int role) const;
bool appendRow(QString data);
private:
QList <QString> lst;
};
#endif // EXERCISES_H
练习.c
#include "exercises.h"
#include <QDebug>
exercisesModel::exercisesModel(QObject *parent) : QAbstractListModel(parent){
}
int exercisesModel::rowCount(const QModelIndex &parent) const{
Q_UNUSED(parent);
return this->lst.size();
}
QVariant exercisesModel::data(const QModelIndex &index, int role) const{
if(this->lst.size() != 0){
if (role == Qt::DisplayRole){
return this->lst[index.row()];
}
return QVariant();
}
return QVariant();
}
bool exercisesModel::appendRow(QString data){
int lastElemPos = this->lst.size();
beginInsertRows(QModelIndex(), lastElemPos, lastElemPos);
this->lst << data;
endInsertRows();
return true;
}
最佳答案
QTableView::model()
成员函数返回一个指向 QAbstractItemModel
的指针。这是编译器在您调用 table->model()->appendRow("Test")
时所知道的所有类型。它不知道您的派生模型是实际指向的模型。有几种方法可以解决这个问题。
一种方法是使用强制转换:
static_cast<exercisesModel*>(table->model())->appendRow("Test")
现在您明确地告诉编译器“我知道对象的实际类型是 exercisesModel
”,因此它可以适本地处理它。
正如 Kuba Ober 所指出的,Qt 有自己的强制转换来验证类型是否正确
qobject_cast<exercisesModel*>(table->model())->appendRow("Test")
这比 static_cast
好,但这种检查只会在运行时进行,编译时发现的问题越多越好。
最好的选择可能是保留指向您的 exercisesModel
的指针并使用它,这样就不用担心底层类型是什么了。
关于c++ - 子类化:QAbstractItemModel 没有成员,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25119648/