无法从`QSortFilterProxyModel`派生

时间:2014-02-20 17:32:58

标签: c++ qt

我正在尝试使用自定义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"); 。)

不幸的是,我从编译器收到以下错误:

  

错误C2248:'QSortFilterProxyModel :: QSortFilterProxyModel':不能   访问在类'QSortFilterProxyModel'

中声明的私有成员

...我注意到基类的构造函数QSortFilterProxyModel::QSortFilterProxyModel被声明为public

// (From *qsortfilterproxymodel.h*, in the Qt core)
public:
    explicit QSortFilterProxyModel(QObject *parent = 0);

我的问题:为什么我收到错误'QSortFilterProxyModel::QSortFilterProxyModel' : cannot access private member我该怎么做才能解决这个问题?


注意:

从其他问题,例如thisthisthis,我看到我可能会通过复制某个地方 - QObject s不允许这样做。< / p>

但是,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派生类,因为它无法复制。)

1 个答案:

答案 0 :(得分:1)

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和其他一些地方调用,主要与QObjectQVariant中的模板化连接方法有关。