【发布时间】:2014-02-20 17:32:58
【问题描述】:
我正在尝试使用自定义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?我该怎么做才能解决这个问题?
注意:
从其他问题,例如this、this 和this,我看到我可能会通过复制某处 - QObjects 不允许这样做。
但是,我的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 的 cmets:
我已删除 Q_DECLARE_METATYPE(QSortFilterProxyModel_NumbersLast)
和 qRegisterMetaType<QSortFilterProxyModel_NumbersLast>("QSortFilterProxyModel_NumbersLast");
注册。我现在收到的错误是:
类型未注册,请使用 Q_DECLARE_METATYPE 宏 让 Qt 的元对象系统知道它
我不相信我在复制 QSortFilterProxyModel_NumbersLast 实例。因此,我不明白为什么会触发此错误。
(请注意,最初,我没有注册了QSortFilterProxyModel_NumbersLast 类。只是由于上述错误,我才注册了该类。但回想起来,我很清楚, QObject-派生类不能注册,因为不能复制。)
【问题讨论】:
-
Kuba - 建议 我可能在代码的其他地方做的事情是一回事。告诉我我必须做什么是另一回事。我相当明确地告诉您,我更新了我的问题以确认我没有在此实例上明确调用信号/插槽连接。此外,这是一个 compile-time 错误 - 我如何在调试器中单步执行代码?