2014-02-20 38 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它的那些你到哪兒去的問題之一*簡易拍攝*自己的腳通過不提供能重現問題的單個文件,自包含的例子。你幾分鐘內就知道到底發生了什麼問題。除非你提供這樣一個例子,否則我會投票決定將其視爲無法再現的。測試用例就是你的工作,如果沒有它,問題是無法解決的。 –