Anpassen der Bildlaufleiste über QListWidget

8

Ich möchte meine eigene halbtransparente Bildlaufleiste implementieren, die über das QListWidget gezeichnet wird, anstatt permanenten Platz in ihrem Ansichtsfenster einzunehmen. Ich möchte QML nicht als mein QListWidget verwenden und sein dynamischer Inhalt ist bereits seit 6 Monaten vollständig entwickelt.

Wie kann ich das erreichen? Stylesheets sind für diesen Zweck nutzlos, da sie die Positionierung der Bildlaufleiste nicht bestimmen. Ich möchte, dass es oben auf dem QListWidget steht, nicht auf seiner Seite und seinen Platz einnimmt.

Ich spreche von etwas in der Nachbarschaft:

Irgendwelche Hinweise, wie man das macht, werden geschätzt.

    
JasonGenX 29.04.2013, 18:52
quelle

2 Antworten

14

Was du versuchst zu tun, ist ein perfektes Beispiel für eine Sache, die mich ständig nervös macht - wenn es einen grafischen Effekt gibt, an den Qt's Designer nicht gedacht haben, ist es ein Schmerz, ständig dagegen anzukämpfen Qt, und normalerweise endet mit aufgeben sowieso.

Ich vermute, dass Sie es mit kleinen Bildschirmen im Kopf haben (Handys? Tablets?), also gibt es wohl keinen anderen Weg, dieses Problem zu lösen.

Was ich hier versuche, ist hacky, aber ansonsten müssten Sie wahrscheinlich die gesamte Bildlaufleiste selbst umschreiben, nur um die wenigen fehlenden Details hinzuzufügen. Mein Vorschlag ist:

%Vor%

Und in myscrollbar.cpp

%Vor%

Dieser Scroller ist in jedem seiner nicht-vitalen Teile transparent (sowohl visuell als auch in Bezug auf Ereignisse). Es erzeugt immer noch einige Artefakte auf Widgets, die darunter liegen - ich denke, setMask() sollte niemals so benutzt werden. Um dies zu verringern, können Sie valueChanged() signal mit update() slot des Ansichtsfensters Ihres Listen-Widgets verbinden. Dies funktionierte gut in meinem Spielzeug-Beispiel, aber wenn Sie benutzerdefinierte Widgets in Ihre Liste einbetten, könnte es unerträglich werden, damit umzugehen. Es kann auch zu Leistungsproblemen bei komplexeren Anwendungen führen - insbesondere wenn Sie für mobile Plattformen schreiben.

Alternativ können Sie auch die gesamte QScrollBar-Klasse "forken" und einfach ihr paintEvent so ändern, dass sie weniger subControls als SC_All verwendet - mit zusätzlichem setAttribute(Qt::WA_OpaquePaintEvent, false); im Konstruktor sollte sie visuelle Transparenz bieten. Dann sollten Sie auch Mausereignisse (wenn Sie nichts Wichtiges treffen) an Ihr Ansichtsfenster des Listen-Widgets weiterleiten (erneut Probleme mit benutzerdefinierten Widgets in der Ansicht).

Was bleibt, ist, eine eigene Layout-Klasse zu schreiben (oder sie einfach manuell zu positionieren), die sowohl Listview als auch Scrollbar in den richtigen Positionen aufeinanderlegt - QStackedLayout klingt gut, aber es kann immer nur eine Ebene sichtbar sein - eindeutig nicht das, was wir suchen.

Der letzte Schritt ist das Ausschalten der Standard-Bildlaufleisten in der Ansicht und das Verbinden von Signalen / Slots der standardmäßigen (unsichtbaren) Bildlaufleiste mit den Slots / Signalen Ihrer Bildlaufleiste, um den tatsächlichen Bildlauf zu erreichen.

In Kürze wird dafür eine LOS Programmierung benötigt. Sind Sie sicher, dass sich solch ein einfacher Effekt lohnt?

** BEARBEITEN: **

Ich erstelle eine Layout-Klasse, um Widgets übereinander zu stapeln - diese Frage hat mich motiviert, es endlich zu tun;)

%Vor%

Und die Datei stacklayout.cpp:

%Vor%

Angenommen, Sie haben bereits eine schöne transparente Bildlaufleiste, um sie einzufügen, würden Sie tun:

%Vor%     
j_kubik 03.05.2013, 02:38
quelle
2

Hier ist ein Beispielcode für Ihre Frage.

Nicht fertig: Mausbewegung des Scrollers

Erledigt: Unterstützung aller Maus-Hover / Leave-Ereignisse Unterstützung beim Scrollen Bildlaufleiste ist transparent für Mausereignisse

Es ist ein guter Ausgangspunkt für jede Anpassung, abhängig von Ihrer Aufgabe. Verwendung:

%Vor%

MegaScrollBar.h

%Vor%

MegaScrollBar.cpp

%Vor%

Vorschau:

Es ist möglich, ein Widget für die Scroll-Taste einzurichten: Hier ist eine benutzerdefinierte: ScrollButton.h

%Vor%

ScrollButton.cpp

%Vor%

Bitte kommentieren Sie, wenn Sie mit Mausinteraktionen nicht umgehen können.

    
Dmitry Sazonov 03.05.2013 15:39
quelle

Tags und Links