我在使用我正在处理的项目中运行派生类时遇到了一些困难。
该项目正在使用QT。我使用的是模型 - 视图架构,项目有很多模型,它们或多或少地模拟了不同的业务对象,它们共享很多逻辑。
目前,每个模型都继承自QAbstractTableModel并且功能令人满意。问题是这些模型之间存在一些重复,我强烈希望不要多次重复代码。
因此,我创建了一个通用基类,它继承自QAbstractTableModel,它实现了通用功能(向数据库添加行,执行公共业务逻辑,检索标题数据)。视图使用的模型继承自此派生类,并实现特定于表的功能(主要从表示数据的对象获取和设置数据)。因此,通用基类提供了部分功能,模型的特定实例完成了它。
所以QAbstractTableModel - > QualityItemModel - > (视图将使用的各种模型)。
QualityItemModel我已经制作了一个模板,因为一些共享代码必须使用不同的类型。
问题是,在尝试调用这些方法时,我在链接后遇到以下错误。
/home/user/program/project/UI/complaintsui.cpp:136: undefined reference to `ComplaintsModel::clear()'
moc_complaintsmodel.o:(.data.rel.ro._ZTV15ComplaintsModel[_ZTV15ComplaintsModel]+0x70): undefined reference to `ComplaintsModel::index(int, int, QModelIndex const&) const'
moc_complaintsmodel.o:(.data.rel.ro._ZTV15ComplaintsModel[_ZTV15ComplaintsModel]+0x88): undefined reference to `ComplaintsModel::rowCount(QModelIndex const&) const'
moc_complaintsmodel.o:(.data.rel.ro._ZTV15ComplaintsModel[_ZTV15ComplaintsModel]+0x90): undefined reference to `ComplaintsModel::columnCount(QModelIndex const&) const'
moc_complaintsmodel.o:(.data.rel.ro._ZTV15ComplaintsModel[_ZTV15ComplaintsModel]+0xb0): undefined reference to `ComplaintsModel::headerData(int, Qt::Orientation, int) const'
moc_complaintsmodel.o:(.data.rel.ro._ZTV15ComplaintsModel[_ZTV15ComplaintsModel]+0x140): undefined reference to `ComplaintsModel::flags(QModelIndex const&) const'
投诉模型继承自模板,该模板继承自QAbstractTableModel。奇怪的是,我添加的其他方法没有这个错误。模板在头文件中实现,因此问题不是.cpp文件中的模板代码。
代码如下。为简洁起见,我省略了实现中的代码。
QualityItemModel.h
#ifndef QUALITYITEMMODEL_H
#define QUALITYITEMMODEL_H
#include <QVector>
#include <QAbstractTableModel>
template <typename T>
class QualityItemModel : public QAbstractTableModel
{
public:
explicit QualityItemModel(QObject *parent = 0);
QVariant headerData(int section, Qt::Orientation orientation, int role) const;
void remove(int row);
int columnCount(const QModelIndex &parent) const;
Qt::ItemFlags flags(const QModelIndex &index) const;
QModelIndex index(int row, int column, const QModelIndex &parent) const;
int rowCount(const QModelIndex &parent) const;
void add(T c);
void clear();
bool submit();
void junk();
protected:
QVector<T> modelItemList;
int currentRow;
int row;
typename QVector<T>::const_iterator modelItemListItr;
typename QVector<T>::const_iterator begin() const { return modelItemList.begin(); }
typename QVector<T>::const_iterator end() const { return modelItemList.end(); }
};
template <typename T>
QualityItemModel<T>::QualityItemModel(QObject *parent) : QAbstractTableModel(parent)
{
}
template <typename T>
QVariant QualityItemModel<T>::headerData(int section, Qt::Orientation orientation, int role) const
{
}
template <typename T>
void QualityItemModel<T>::remove(int row)
{
}
template <typename T>
int QualityItemModel<T>::columnCount(const QModelIndex &parent) const
{
}
template <typename T>
Qt::ItemFlags QualityItemModel<T>::flags(const QModelIndex &index) const
{
}
template <typename T>
QModelIndex QualityItemModel<T>::index(int row, int column, const QModelIndex &parent) const
{
}
template <typename T>
int QualityItemModel<T>::rowCount(const QModelIndex &parent) const
{
}
template <typename T>
void QualityItemModel<T>::add(T c)
{
}
template <typename T>
void QualityItemModel<T>::clear()
{
}
template <typename T>
bool QualityItemModel<T>::submit()
{
}
template <typename T>
void QualityItemModel<T>::junk() {qDebug() << "Junk";}
#endif // QUALITYITEMMODEL_H
继承此模板的代码是
ComplaintsModel.h
class ComplaintsModel : public QualityItemModel<Complaint>
使用构造函数
ComplaintsModel::ComplaintsModel(QObject *parent) : QualityItemModel(parent)
{
}
然后ComplaintsModel实现'data'和'setdata'方法。
稍后将以下列方式使用
ComplaintsModel *model = new ComplaintsModel(this);
model->clear() // Linker error
model->junk() // No linker error
我怀疑它与QAbstractTableModel是一个抽象类有关,但我不太清楚如何解决这个问题。
另一种方法是我只模板辅助函数,而不是整个类。