2016-12-20 4 views
2

Мой класс SuperTable наследует от QTableView, который, в свою очередь, наследует от QAbstractItemView.Отключить слот от родительского класса QAbstractItemView

В какой-то момент QTableView's QScrollBar испускает сигнал, который запускает слот QAbstractItemView::verticalScrollbarValueChanged(int).

Для моего приложения важно, чтобы этого не произошло, поэтому я хотел бы отключить этот слот в QAbstractItemView, но я не смог найти способ получить к нему доступ от SuperTable.

редактировать/

То, что я пытаюсь, чтобы достичь: данные модели таблицы является больше не доступны, но я хочу, чтобы диалог с QTableView и данные, которые он уже содержит, доступный. Но я не могу назвать его метод data(), потому что мне больше нечего возвращать. По большей части, я достиг этого, с одним большим исключением: всякий раз, когда таблица прокручиваются с помощью мыши над клетками, происходит следующее:

MYAPP :: надтаблица :: данные (QModelIndex сопзИте & , целое) Const
QSortFilterProxyModel :: данные (QModelIndex Const &, внутр) константные
QAbstractItemViewPrivate :: checkMouseMove (QPersistentModelIndex Const &) QAbstractItemView :: verticalScrollbarValueChanged (интермедиат)
QMetaObject :: Activate (QObject *, QMetaObject сопз * , int, void **)
QAbstractSlider :: ValueChanged (интермедиат)

/редактировать

Более конкретно, выглядывая на реализацию Qt о qabstractitemview.cpp, это соединение, я хотел бы отключить:

void QAbstractItemViewPrivate::init() 
{ 
    // (...) 
    QObject::connect(vbar, SIGNAL(valueChanged(int)), 
        q, SLOT(verticalScrollbarValueChanged(int))); 
    // (...) 
} 

Поскольку он находится на частной стороне вещей, не уверен, возможно ли это. Есть ли способ?

+0

Вы сформулировали свой вопрос по классической проблеме XY: вы предполагаете, что решение, которое вы четко видите, не будет работать. Вместо этого вы должны спросить, как решить свою первоначальную проблему - а именно, как кэшировать данные для представления, когда данные исходной модели исчезли. Похоже, что вы реализовали много вещей, преследуя неправильное решение. Пожалуйста, отредактируйте вопрос, чтобы сосредоточиться на исходной проблеме: объясните, как исходная модель теряет свои данные, например. Только упоминайте о своем предлагаемом решении и его бедах в стороне. –

+0

Я не понял - спасибо, что придумал это. – jehuty

ответ

1

Если данные модели ушли, то они исчезли, и это задача представления, чтобы уведомить пользователя об этом факте.

Если вы не хотите, чтобы данные были убраны, сделайте это, вместо того чтобы лежать на вид. Представление может запрашивать данные модели в любое время, и ваша зависимость от вида, как бы ни покоя «если только» полосы прокрутки не перемещаются, неверна. Между мнением и моделью нет такого договора, который бы гарантировал такое поведение.

Правильный подход заключается в том, чтобы вставить прокси-модель кэширования прокси-сервера между моделью и представлением. Когда исходная модель указывает, что у нее больше нет данных (она может сигнализировать о сбросе или указывать, что все строки были удалены), прокси ограничил бы свои собственные данные определенной недавно кэшированной смежной группой строк, возможно, запросив представление о видимых строк. Конечно, вам нужен один прокси-сервер.

Также обратите внимание, что если вы внедрили свою собственную модель, которая не указывает на то, что она пуста, но каким-то образом возвращает разные значения от data (или сбой!), Не излучая соответствующие сигналы - вы уже нарушили все, что не подлежит ремонту.Состояние модели, видимое любому внешнему наблюдателю, должно быть последовательным.