2014-02-20 40 views
1

我想使用自定义QSortFilterProxyModel不能派生自`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; 

}; 

这里是从源文件的构造:(。另外,我有正确 - 我觉得 - 叫Q_DECLARE_METATYPE(QSortFilterProxyModel_NumbersLast) qRegisterMetaType<QSortFilterProxyModel_NumbersLast>("QSortFilterProxyModel_NumbersLast");

QSortFilterProxyModel_NumbersLast::QSortFilterProxyModel_NumbersLast(QObject * parent) 
    : QSortFilterProxyModel(parent) 
{ 
} 

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

错误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秒。

但是,我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"); 登记。我现在收到的错误是:

类型未注册,请使用Q_DECLARE_METATYPE宏 让他们知道Qt的元对象系统

我不相信我复制QSortFilterProxyModel_NumbersLast实例。因此,我不明白为什么会引发这个错误。 (请注意,最初,我有而不是注册了QSortFilterProxyModel_NumbersLast类。这只是由于我注册了类的上述错误。我很清楚,但是,现在回想起来,那一个QObject派生类不能注册,因为它不能被复制。)

+0

库巴 - 这是一个事*建议*我可能是在我的代码在其他地方做。告诉我我*必须做的事情是另一回事。我相当明确地告诉你,我更新了我的问题,以确认我在这个实例上没有明确地调用信号/插槽连接。此外,这是一个*编译时*错误 - 我如何在调试器中逐句通过代码? –

回答

1

Q_DECLARE_METATYPE需要访问拷贝构造函数,而一个被删除(C++ 11 )或在所有QObject派生类中不可访问(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

+0

在我注册该类型之前,我收到了一个我没有的错误。我将在这里删除注册,并查看错误是否被复制。 –

+0

我不''使用代理模型连接信号/插槽。至少不是明确的,任何地方。 –

+0

@DanNissenbaum它的那些你到哪儿去的问题之一*简易拍摄*自己的脚通过不提供能重现问题的单个文件,自包含的例子。你几分钟内就知道到底发生了什么问题。除非你提供这样一个例子,否则我会投票决定将其视为无法再现的。测试用例就是你的工作,如果没有它,问题是无法解决的。 –