[gelöst] QT eigenen Slider erstellen

Alles rund um die Programmierung mit Qt
BDahl
Beiträge: 12
Registriert: 1. Juni 2011 15:06

[gelöst] QT eigenen Slider erstellen

Beitrag von BDahl »

Hallo,
ich wollte einen speziellen Slider für eine qtscrollarea erstellen doch ich finde nirgendwo einen anfang.
Das Besondere an dem Slider(vertikal) soll sein das unterhalb des Sliders noch 2 buttons liegen sollten, welche andere Funktionen ausführen.
Kann mir jemand helfen?????
Zuletzt geändert von BDahl am 3. August 2011 19:14, insgesamt 1-mal geändert.
js
Beiträge: 59
Registriert: 4. Juli 2011 21:29

Re: QT eigenen Slider erstellen

Beitrag von js »

mit Qt Designer geht es ganz gut
BDahl
Beiträge: 12
Registriert: 1. Juni 2011 15:06

Re: QT eigenen Slider erstellen

Beitrag von BDahl »

kannst du mal Stichpunktartig Beschreiben wie du das im Designer machst???
Vielleicht zur Präziseren erklärung:
Ich wollte die Scrollbar mit Buttons ergänzen.
Doch ich finde nirgendwo einen Anhaltspunkt wie bzw. wo die Scrollbar ihre Graphischenwidgets hat...
Hat jemand eine Anhaltspunkt???
RHBaum
Beiträge: 1436
Registriert: 17. Juni 2005 09:58

Re: QT eigenen Slider erstellen

Beitrag von RHBaum »

wenn du das teil in QScrollArea "einhängen" willst, musst du von QScrollbar ableiten ...
Ansonsten muesstest du QAbstractScrollArea neu definieren ...

Code: Alles auswählen

void QAbstractScrollArea::setHorizontalScrollBar ( QScrollBar * scrollBar )
void QAbstractScrollArea::setVerticalScrollBar ( QScrollBar * scrollBar )
sauberer waer, wenn die QAbstractScrollArea statt ScrollBars auch QAbstractSlider akzeptieren wuerd. iss aber nicht :-(

Die gechichte mit der UI(Designer) wuerd ich mir sparen, So oft gestaltet man das Ding ned um, und dafuer nen UI file und ne Abstracte zwischenklasse zur konfiguration iss IMHO zu viel Aufwand.
Besser per code designen ... aber das ist auch Geschmackssache

Also einfach per code deine Buttons und deine QScrollbar zusammenlayouten in deiner von QScrollbar abgeleitetet Klasse .
Alle funktionen an deiner Basisklasse die von QScrollbar kommen, an den Member QScrollBar weiterleiten
und entsprechende Signals fuer deine Button-Funktionalitaet einfügen und mit den Button(s) verbinden, fertig ....

Ciao ...
BDahl
Beiträge: 12
Registriert: 1. Juni 2011 15:06

Re: QT eigenen Slider erstellen

Beitrag von BDahl »

Hi,
die Antwort hat mir schon geholfen aber nun hast du einen wunden punkt getroffen...
Wie füge ich der bisherigen scrollbar noch knöpfe hinzu? ich finde nämlich nicht den Punkt wo ich das scrollbarwidget also den slider mit den up und down key bekomme... Kann mir jemand weiterhelfen?
RHBaum
Beiträge: 1436
Registriert: 17. Juni 2005 09:58

Re: QT eigenen Slider erstellen

Beitrag von RHBaum »

Genau das ist eben ned so einfach.

Dein Dilemma ist:
Du brauchst die Schnittstelle von QScrollbar (damit es die Funktionalitaet in QAbstractScrollView übernehmen kann)
Du darfst nicht die Funktionalitaet von QScrollbar übernehmen (QScrollbar zeichnet sich selber, ohne Buttons, dadurch haettest du an der Stelle verloren)

Dafuer gibt es in C++ nicht wirklich eine Saubere Lösung.

Lösung 1:
virtuelle Vererbung.
DU erbst Hart von QWidget, weil du bist und brauchst die funktionalitaet von QWidget, du erbst virtual von QScrollBar

class MyOwnScrollBar, : public QWidget, public virtual QStatusBar

Im Konstruktor dein layot aufbauen mit einem QStatusbar Member
alle vererbten funktionalitaeten von QStatusbar an den Member QStatusBar weiterreichen ...
....

Lösung 2:
Du meidest QAbstractScrollArea und implementierst es sesbler, mit deinem eigenen Scroll vorstellungen.
QAbstractScrollArea ist scheinbar nicht fuer die Verwendung anderer Scrollbars gedacht, als QScrollbar ...

Hab sowas noch nie gemacht ...
Keine Ahnung was mehr aufwand ist ...

Ciao ...
BDahl
Beiträge: 12
Registriert: 1. Juni 2011 15:06

Re: QT eigenen Slider erstellen

Beitrag von BDahl »

Vielen Dank für die Hilfe werde ich gleich mal ausprobieren.
Gibt es irgendwie eine Doku wie die ScrollBar intern aufgebaut ist (in Form von Homepage oder Buch) oder muss man sich da durch den Quellcode wursteln?
upsala
Beiträge: 3946
Registriert: 5. Februar 2006 20:52
Wohnort: Landshut
Kontaktdaten:

Re: QT eigenen Slider erstellen

Beitrag von upsala »

Code: Alles auswählen

void QAbstractScrollArea::addScrollBarWidget ( QWidget * widget, Qt::Alignment alignment )
BDahl
Beiträge: 12
Registriert: 1. Juni 2011 15:06

Re: QT eigenen Slider erstellen

Beitrag von BDahl »

hmm ok und was muss ein scrollbarwidget so alles können????
ich hab nunmal einfach mal folgendes gemacht:

Code: Alles auswählen

QScrollBar* vscroll=scrollArea->verticalScrollBar();
    vscroll->setParent(0);
    QWidget * w = new QToolButton;
    w->setFixedHeight(height());
    w->setAutoFillBackground(true);
    w->setStyleSheet("QToolButton {\
            border: 1px solid #a0a0a0;\
            border-top: 0px;\
            border-left: 0px;\
            border-right: 0px;\
            background-color: qlineargradient(x1:0, y1:0, x2:0, y2:1,\
                stop:0 #ffffff, stop:0.5 #e0e0e0, stop:1 #ffffff);\
        }");

    scrollArea->addScrollBarWidget(w,Qt::AlignTop);
Nun erscheint an der rechten!!!! seite ein Button. Eigentlich sollte er oben hin... Weiss jemand rat????
franzf
Beiträge: 3114
Registriert: 31. Mai 2006 11:15

Re: QT eigenen Slider erstellen

Beitrag von franzf »

BDahl hat geschrieben:Nun erscheint an der rechten!!!! seite ein Button. Eigentlich sollte er oben hin... Weiss jemand rat????
Wie, was, rechte Seite? Oben?
alignment must be one of Qt::Alignleft and Qt::AlignRight, which maps to the horizontal scroll bar, or Qt::AlignTop and Qt::AlignBottom, which maps to the vertical scroll bar.
Qt::AlignTop bezieht sich somit auf die vertikale Scrollbar, und sollte oberhalb dieser angezeigt werden.
Und was diese beiden Zeilen machen sollen, weiß ich nicht...

Code: Alles auswählen

vscroll->setParent(0);
...
w->setFixedHeight(height());
upsala
Beiträge: 3946
Registriert: 5. Februar 2006 20:52
Wohnort: Landshut
Kontaktdaten:

Re: QT eigenen Slider erstellen

Beitrag von upsala »

Das Besondere an dem Slider(vertikal) soll sein das unterhalb des Sliders noch 2 buttons liegen sollten
un erscheint an der rechten!!!! seite ein Button. Eigentlich sollte er oben hin...
Vergessen, was du eigentlich wolltest oder auf dem ! eingeschlafen?
BDahl
Beiträge: 12
Registriert: 1. Juni 2011 15:06

Re: QT eigenen Slider erstellen

Beitrag von BDahl »

also eigentlich sollte er auf der rechten seite liegen.
Dies tut er nur wenn ich

Code: Alles auswählen

QT::AlignTop
verwende.
Bei

Code: Alles auswählen

QT::AlignLeft
dann erscheint er als Horizontale Bar.
ist es ein QT Fehler?????
BDahl
Beiträge: 12
Registriert: 1. Juni 2011 15:06

Re: QT eigenen Slider erstellen

Beitrag von BDahl »

franzf hat geschrieben:
BDahl hat geschrieben: Und was diese beiden Zeilen machen sollen, weiß ich nicht...

Code: Alles auswählen

vscroll->setParent(0);
...
w->setFixedHeight(height());
Also

Code: Alles auswählen

vscroll->setParent(0)
hängt die bisherige scrollbar aus, wenn ich die nicht aushänge, hängt qt irgendwie keine neue ein.

Code: Alles auswählen

w->setFixedHeight(height());
dient damit der button auf jedenfall eine fixe größe hat.
franzf
Beiträge: 3114
Registriert: 31. Mai 2006 11:15

Re: QT eigenen Slider erstellen

Beitrag von franzf »

Nein, das ist kein Fehler, sondern genau so gewollt, hab sogar den Ausschnitt aus der Doku zitiert!
Eine QAbstractScrollArea (und damit alles, was einen viewport scrollt) hat eine vertikale Scrollbar (von oben nach unten = rechts) und eine horizontale scrollbar (von links nach rechts = unten).
Die horizontale hat jetzt rechts und links Platz für zusätzliche Widgets, deshalb mapt die Funktion AlignLeft und AlignRight auf die horizontale Bar, und fügt entsprechend links oder rechts von dieser Bar das angegebene Widget ein.
Bei der vertikalen ist oben und unten Platz -> AlignTop und AlignBottom beziehen sich auf oberhalb und unterhalb dieser vertikalen ScrollBar.
franzf
Beiträge: 3114
Registriert: 31. Mai 2006 11:15

Re: QT eigenen Slider erstellen

Beitrag von franzf »

BDahl hat geschrieben:Also

Code: Alles auswählen

vscroll->setParent(0)
hängt die bisherige scrollbar aus, wenn ich die nicht aushänge, hängt qt irgendwie keine neue ein.
Nein, tut es nicht. Außerdem willst du gar keine neue einhängen (machst du eh nicht, zuständig wäre setVerticalScrollBar()), du willst jetzt mit addScrollBarWidget ein widget anzeigen.

Code: Alles auswählen

w->setFixedHeight(height());
dient damit der button auf jedenfall eine fixe größe hat.
Und warum height()? Das ist die Höhe des aktuellen Widgets (this) - wahrscheinlich dein MainWindow. Wenn das im Konstruktor passiert, kann das IRGENDWAS machen, da gabs noch kein show oder resize...
Außerdem ist das ein ToolButton, der sollte doch eigentlich wissen, wie groß er sein soll?
Antworten