我正在尝试使用自定义的QSortFilterProxyModel。
这是我的标题:
#include <QSortFilterProxyModel>
class QSortFilterProxyModel_NumbersLast : public QSortFilterProxyModel
{
Q_OBJECT
public:
QSortFilterProxyModel_NumbersLast(QObject * parent = nullptr);
bool lessThan(const QModelIndex &left, const QModelIndex &right) const;
};下面是源文件中的构造函数:
QSortFilterProxyModel_NumbersLast::QSortFilterProxyModel_NumbersLast(QObject * parent)
: QSortFilterProxyModel(parent)
{
}(此外,我也正确地称其为Q_DECLARE_METATYPE(QSortFilterProxyModel_NumbersLast)和qRegisterMetaType<QSortFilterProxyModel_NumbersLast>("QSortFilterProxyModel_NumbersLast");。)
不幸的是,我从编译器收到以下错误:
错误'QSortFilterProxyModel::QSortFilterProxyModel‘:C2248:无法访问类'QSortFilterProxyModel’中声明的私有成员
..。我确实注意到基类QSortFilterProxyModel::QSortFilterProxyModel的构造函数被声明为public。
// (From *qsortfilterproxymodel.h*, in the Qt core)
public:
explicit QSortFilterProxyModel(QObject *parent = 0);我的问题是:为什么我要接收错误'QSortFilterProxyModel::QSortFilterProxyModel' : cannot access private member**?** ,我能做些什么来解决这个问题?
注:
从其他问题(如this、this和this )中,我看到我可能会在某个地方复制--这是QObject不允许的。
但是,我的QSortFilterProxyModel_NumbersLast的唯一用途是:
QStandardItemModel * model = new QStandardItemModel(ui->listView_dmu_members);
QSortFilterProxyModel_NumbersLast *proxyModel = new QSortFilterProxyModel_NumbersLast(ui->listView_dmu_members);
proxyModel->setSourceModel(model);
ui->listView_dmu_members->setModel(model);..。我想这不会触发一份副本。
注2:
Per @KubaOber的评论:
我已经删除了的,Q_DECLARE_METATYPE(QSortFilterProxyModel_NumbersLast)和qRegisterMetaType<QSortFilterProxyModel_NumbersLast>("QSortFilterProxyModel_NumbersLast");注册。我现在收到的错误是:
类型未注册,请使用Q_DECLARE_METATYPE宏将其告知Qt的元对象系统。
我不相信我正在复制QSortFilterProxyModel_NumbersLast实例。因此,我不明白为何会触发这个错误。
(注意,最初,我没有注册QSortFilterProxyModel_NumbersLast类。正是由于上面的错误,我才注册了这门课。但是,回想起来,我清楚地看到,不能注册QObject-derived类,因为它不能被复制。)
发布于 2014-02-20 17:42:56
Q_DECLARE_METATYPE需要访问复制构造函数,并且在所有QObject派生类中都删除(C++11)或不可访问(C++98)。这是编译器抱怨的构造函数。修正是不声明代理筛选器模型元类型。
下面的内容在Qt 4.5.8和5.2.1中都适用于我,跨主要的桌面平台。
#include <QApplication>
#include <QSortFilterProxyModel>
#include <QListView>
#include <QStandardItemModel>
class QSortFilterProxyModel_NumbersLast : public QSortFilterProxyModel
{
Q_OBJECT
public:
QSortFilterProxyModel_NumbersLast(QObject * parent = nullptr) :
QSortFilterProxyModel(parent) {}
bool lessThan(const QModelIndex &, const QModelIndex &) const {
return false;
}
};
int main(int argc, char *argv[])
{
QApplication app(argc, argv);
QStandardItemModel * model = new QStandardItemModel(&app);
QSortFilterProxyModel_NumbersLast *proxyModel = new QSortFilterProxyModel_NumbersLast(&app);
proxyModel->setSourceModel(model);
QListView view;
view.setModel(model);
view.show();
model->appendRow(new QStandardItem("Foo"));
model->appendRow(new QStandardItem("Bar"));
model->appendRow(new QStandardItem("Baz"));
return app.exec();
}
#include "main.moc"在Qt 5中,您看到的错误消息来自qMetaTypeId方法。这是一个静态断言,因此您可能看到了编译时错误。此方法是从qRegisterMetaType和其他几个地方调用的,主要与QObject中的模板化连接方法和QVariant有关。
https://stackoverflow.com/questions/21915328
复制相似问题