c++ - 无法从 `QSortFilterProxyModel` 派生

标签 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"); 。)

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

error C2248: 'QSortFilterProxyModel::QSortFilterProxyModel' : cannot access private member declared in class '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:

根据@KubaOber 的评论:

我已经删除 Q_DECLARE_METATYPE(QSortFilterProxyModel_NumbersLast) qRegisterMetaType<QSortFilterProxyModel_NumbersLast>("QSortFilterProxyModel_NumbersLast"); 登记。我现在收到的错误是:

Type is not registered, please use the Q_DECLARE_METATYPE macro to make it known to Qt's meta-object system

我不相信我在复制 QSortFilterProxyModel_NumbersLast实例。因此,我不明白为什么会触发此错误。

(请注意,最初,我没有注册QSortFilterProxyModel_NumbersLast类。只是由于上述错误,我注册了该类。然而,回想起来,我很清楚, QObject - 派生类无法注册,因为无法复制。)

最佳答案

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 中的模板化连接方法有关。

关于c++ - 无法从 `QSortFilterProxyModel` 派生,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21915328/

相关文章:

c++ - 为什么这些条件不适用于模板类型?

c++ - 为什么 sqrt() 在没有为 int 定义的 int 变量上工作正常?

c++ - 如何使用 ncurses 在 C++ 上打印矩阵?

c++ - 为什么消息循环不会阻止 Windows 应用程序中的 GUI,但在 Qt 中会阻止?

python - Linux Qt QDesktopServices::storageLocation

qt - 如何在 Qt 小部件中捕获 Tab 键

c++ - 在 Qt 5.2.1 上编写的 SSL 服务器的 SSL 握手失败

c++ - 禁止多次创建线程

c++ - 如何有效地检查/限制 sqlite 数据库的大小?

qt - 如何在paintEvent之外获取QPainter的字体规范?