2014-02-20 14 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? Что я могу сделать, чтобы исправить это?


Примечание:

Из других вопросов, таких как 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:

Per @ KubaOber Замечаний:

У меня есть удаленыQ_DECLARE_METATYPE(QSortFilterProxyModel_NumbersLast) и qRegisterMetaType<QSortFilterProxyModel_NumbersLast>("QSortFilterProxyModel_NumbersLast"); регистрации. Ошибка Теперь я получаю это:

Тип не зарегистрирован, пожалуйста, используйте Q_DECLARE_METATYPE макрос возвестит мета-объектной системы в Qt

Я не верю, что я копирую экземпляр QSortFilterProxyModel_NumbersLast , Поэтому я не понимаю, почему эта ошибка будет вызвана.

(Обратите внимание, что изначально у меня был нет зарегистрирован класс QSortFilterProxyModel_NumbersLast. Только из-за вышеуказанной ошибки я зарегистрировал класс.Я ясно, однако, в ретроспективе, что QObject -derived класс не может быть зарегистрирован, поскольку он не может быть скопирован.)

+0

Куба - это одно, что можно предложить *, что я мог бы делать в другом месте моего кода. Другое дело, сказать мне, что я должен сделать. Я прямо сказал вам, что обновил свой вопрос, чтобы подтвердить, что я * не * явно вызывал соединение с сигналом/слотом в этом экземпляре. Кроме того, это ошибка * compile-time * - как мне пройти код в отладчике? –

ответ

1

Q_DECLARE_METATYPE требует доступа к конструктору копию, и что один удален (C++ 11) или недоступным (C++ 98) во всех классах, генерирующих QObject. Это конструктор, о котором жалуется компилятор. Исправлено не объявление метатепа модели фильтра прокси.

Нижеследующее работает для меня под 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 Это одна из тех проблем, в которой вы * суммировали * застрелили себя в ноге, не предоставляя одиночный, автономный пример, который воспроизводит проблему. Вы бы точно знали, что не так в течение нескольких минут. Если вы не представите такой пример, я буду голосовать, чтобы закрыть это как невыполнимое. Тестовый пример - это ваша работа, и вопрос без него невозможен. –

Смежные вопросы