我对C++和Qt还比较陌生。我尝试使用从QTableView派生的自定义模型来实现一个简单的QAbstractListModel。
如果我打电话
model->appendRow("Test");在我的主要应用程序中,一切都很好。不过,如果我打电话
table->model()->appendRow("Test");我得到以下构建错误:
'class QAbstractItemModel' has no member named 'appendRow'
table->model()->appendRow("Test");
^我遗漏了什么?
Sourcecode
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;
}发布于 2014-08-04 13:29:55
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的指针并使用它,因此没有问题的基础类型是什么。
发布于 2014-08-04 13:34:09
因为table->model()返回一个QAbstractItemModel,而QAbstractItemModel没有在exerciseModel中声明的appendRow函数,这是QAbstractItemModel的一个子类。编译器无法知道存储的table的实际类型。
要从appendRow访问table->model(),需要进行类型转换:
exercisesModel *model = qobject_cast<exercisesModel *>(table->model());
// dynamic_cast could also be used.
Q_ASSERT(model);
model->appendRow("Test");https://stackoverflow.com/questions/25119648
复制相似问题