Was ist der beste Weg, um ein animiertes Icon in einem QTableView anzuzeigen?

9

Ich habe jetzt schon einige Male mit diesem Problem zu kämpfen, und ich kann nicht den richtigen Weg finden, dies zu tun.

Was ich möchte, ist die Möglichkeit, ein animiertes Symbol als Dekoration für einige meiner Artikel zu verwenden (normalerweise um zu zeigen, dass eine Verarbeitung für diesen bestimmten Artikel stattfindet). Ich habe ein benutzerdefiniertes Tabellenmodell, das ich in QTableView anzeigen kann.

Meine erste Idee war, einen benutzerdefinierten Delegaten zu erstellen, der sich um die Anzeige der Animation kümmern würde. Wenn ein QMovie für die Dekorationsrolle übergeben wurde, würde der Delegat eine Verbindung zum QMovie herstellen, um die Anzeige jedes Mal zu aktualisieren, wenn ein neuer Rahmen verfügbar ist (siehe Code unten). Der Maler scheint jedoch nach dem Aufruf der Methode paint des Delegaten nicht gültig zu bleiben (beim Aufruf der save -Methode des Malers wird ein Fehler ausgegeben, wahrscheinlich weil der Zeiger nicht mehr auf gültigen Speicher zeigt).

Eine andere Lösung wäre, das dataChanged -Signal des Elements jedes Mal zu emittieren, wenn ein neuer Frame verfügbar ist, aber 1), der viele unnötige Overheads verursachen würde, da die Daten nicht wirklich geändert werden; 2) es scheint nicht wirklich sauber zu sein, den Film auf Model-Ebene zu behandeln: Es sollte die Verantwortung der Display-Ebene ( QTableView oder der Delegierte) sein, die Anzeige neuer Frames zu handhaben.

Kennt jemand eine saubere (und vorzugsweise effiziente) Möglichkeit, Animationen in Qt-Ansichten anzuzeigen?

Für die Interessierten, hier ist der Code des Delegierten, den ich entwickelt habe (was im Moment nicht funktioniert).

%Vor%     
Luc Touraille 05.12.2010, 21:36
quelle

1 Antwort

5

Für die Aufnahme habe ich schließlich QAbstractItemView::setIndexWidget in% verwendet. co_de% Methode meines Delegaten, um ein paint einzufügen, das QLabel im Element anzeigt (siehe Code unten).

Diese Lösung funktioniert sehr gut und behebt die Anzeigeprobleme getrennt vom Modell. Ein Nachteil ist, dass die Anzeige eines neuen Frames im Label dazu führt, dass das gesamte Item erneut gerendert wird, was zu fast kontinuierlichen Aufrufen der Methode QMovie des Delegates führt ...

Um den durch diese Aufrufe verursachten Overhead zu reduzieren, habe ich versucht, den Aufwand für die Verarbeitung von Filmen im Delegaten zu minimieren, indem ich das vorhandene Label wiederverwende, falls eines vorhanden ist. Dies führt jedoch zu einem seltsamen Verhalten bei der Größenanpassung der Fenster: Die Animation wird nach rechts verschoben, als ob zwei Beschriftungen nebeneinander positioniert wären.

Also, hier ist eine mögliche Lösung, fühlen Sie sich frei, Möglichkeiten zur Verbesserung zu kommentieren!

%Vor%     
Luc Touraille 09.12.2010, 09:22
quelle