2016-12-20 6 views
2

Meine Klasse SuperTable erbt von QTableView, die wiederum von QAbstractItemView erbt.Steckplatz von der übergeordneten Klasse trennen QAbstractItemView

An einem bestimmten Punkt gibt die QTableViewQScrollBar ein Signal aus, das den QAbstractItemView::verticalScrollbarValueChanged(int)-Steckplatz auslöst.

Für meine Anwendung ist es wichtig, dass dies nicht geschieht, also möchte ich diesen Steckplatz in QAbstractItemView trennen, aber ich war nicht in der Lage, einen Weg zu finden, um Zugriff darauf von SuperTable zu erhalten.

bearbeiten/

Was ich versuche zu erreichen: die Daten der Tabelle Modell ist nicht mehr verfügbar, aber ich will den Dialog halten mit dem QTableView und die Daten, die es bereits enthält, zur Verfügung. Aber ich kann nicht seine data() Methode aufgerufen werden, weil ich nichts mehr zurückgeben muss. Zum größten Teil, ich habe dies erreicht, mit einer großen Ausnahme: Immer, wenn die Tabelle mit der Maus über die Zellen gescrollt wird, geschieht Folgendes:

myApp :: :: Daten von über- und (QModelIndex const & , int) const
QSortFilterProxyModel :: data (QModelIndex const &, int) const
QAbstractItemViewPrivate :: checkMouseMove (QPersistentModelIndex const &) QAbstractItemView :: verticalScrollbarValueChanged (int)
QMetaObject :: activate (QObject *, QMetaObject const * , int, void **)
QAbstractSlider :: valuechanged (int)

bearbeiten/

Insbesondere bei Qt-Implementierung von qabstractitemview.cpp spähen, ist dies die Verbindung I trennen möchten:

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

Da es auf der privaten Seite der Dinge ist, unsicher, ob das überhaupt möglich ist. Gibt es einen Weg?

+0

Sie haben Ihre Frage in einem klassischen XY-Problem formuliert: Sie setzen voraus, dass eine Lösung, die Sie deutlich sehen, nicht funktioniert. Stattdessen sollten Sie sich fragen, wie Sie Ihr ursprüngliches Problem lösen können - nämlich wie die Daten für eine Ansicht zwischengespeichert werden, wenn die Daten des Quellmodells verschwunden sind. Es sieht so aus, als hättest du viele Dinge implementiert, während du der falschen Lösung nachjagst. Bearbeiten Sie die Frage, um sich auf das ursprüngliche Problem zu konzentrieren: Erläutern Sie, wie das Quellmodell beispielsweise seine Daten verliert. Erwähnen Sie nur Ihre vorgeschlagene Lösung und ihre Probleme als Nebensache. –

+0

Ich hatte es nicht bemerkt - danke, dass du das gebracht hast. – jehuty

Antwort

1

Wenn die Daten des Modells nicht mehr vorhanden sind, ist es verschwunden, und es ist die Aufgabe der Ansicht, den Benutzer über diese Tatsache zu informieren.

Wenn Sie nicht wollen, dass die Daten weg sind, dann lassen Sie sie stehen, anstatt die Ansicht zu belügen. Die Ansicht kann die Daten des Modells zu jeder Zeit anfordern, und Ihre Abhängigkeit von der Ansicht, die irgendwie stillsteht, "wenn nur" Bildlaufleisten sich nicht bewegen, ist falsch. Es gibt keinen Vertrag zwischen der Sichtweise und dem Modell, das ein solches Verhalten garantiert.

Der korrekte Ansatz besteht darin, ein Caching-Proxy-Ansichtsmodell zwischen dem Modell und der Ansicht einzufügen. Wenn das Quellenmodell anzeigt, dass es keine Daten mehr enthält (es könnte ein Zurücksetzen signalisieren oder anzeigen, dass alle Zeilen entfernt wurden), würde der Proxy seine eigenen Daten auf eine bestimmte zuletzt zwischengespeicherte zusammenhängende Gruppe von Zeilen beschränken und vielleicht die Ansicht über sichtbar abfragen Reihen. Sie würden natürlich einen Proxy pro Ansicht benötigen. Wenn Sie Ihr eigenes Modell implementiert haben, das nicht bedeutet, dass es leer ist, aber irgendwie unterschiedliche Werte von data (oder abstürzt!) Zurückgibt, ohne relevante Signale zu senden - Sie haben bereits Dinge über die Reparatur hinaus gebrochen.Der Zustand des Modells, der für jeden externen Beobachter sichtbar ist, muss konsistent sein.

Verwandte Themen