首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >无法从“`QSortFilterProxyModel`”派生

无法从“`QSortFilterProxyModel`”派生
EN

Stack Overflow用户
提问于 2014-02-20 17:32:58
回答 1查看 516关注 0票数 1

我正在尝试使用自定义的QSortFilterProxyModel

这是我的标题:

代码语言:javascript
复制
#include <QSortFilterProxyModel>

class QSortFilterProxyModel_NumbersLast : public QSortFilterProxyModel
{

    Q_OBJECT

    public:

        QSortFilterProxyModel_NumbersLast(QObject * parent = nullptr);

        bool lessThan(const QModelIndex &left, const QModelIndex &right) const;

};

下面是源文件中的构造函数:

代码语言:javascript
复制
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

代码语言:javascript
复制
// (From *qsortfilterproxymodel.h*, in the Qt core)
public:
    explicit QSortFilterProxyModel(QObject *parent = 0);

我的问题是:为什么我要接收错误'QSortFilterProxyModel::QSortFilterProxyModel' : cannot access private member**?** ,我能做些什么来解决这个问题?

注:

从其他问题(如thisthisthis )中,我看到我可能会在某个地方复制--这是QObject不允许的。

但是,我的QSortFilterProxyModel_NumbersLast的唯一用途是:

代码语言:javascript
复制
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类,因为它不能被复制。)

EN

回答 1

Stack Overflow用户

发布于 2014-02-20 17:42:56

Q_DECLARE_METATYPE需要访问复制构造函数,并且在所有QObject派生类中都删除(C++11)或不可访问(C++98)。这是编译器抱怨的构造函数。修正是不声明代理筛选器模型元类型。

下面的内容在Qt 4.5.8和5.2.1中都适用于我,跨主要的桌面平台。

代码语言:javascript
复制
#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有关。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/21915328

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档