[gelöst] QT eigenen Slider erstellen
[gelöst] QT eigenen Slider erstellen
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?????
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.
Re: QT eigenen Slider erstellen
mit Qt Designer geht es ganz gut
Re: QT eigenen Slider erstellen
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???
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???
Re: QT eigenen Slider erstellen
wenn du das teil in QScrollArea "einhängen" willst, musst du von QScrollbar ableiten ...
Ansonsten muesstest du QAbstractScrollArea neu definieren ...
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 ...
Ansonsten muesstest du QAbstractScrollArea neu definieren ...
Code: Alles auswählen
void QAbstractScrollArea::setHorizontalScrollBar ( QScrollBar * scrollBar )
void QAbstractScrollArea::setVerticalScrollBar ( QScrollBar * scrollBar )
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 ...
Re: QT eigenen Slider erstellen
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?
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?
Re: QT eigenen Slider erstellen
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 ...
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 ...
Re: QT eigenen Slider erstellen
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?
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?
Re: QT eigenen Slider erstellen
Code: Alles auswählen
void QAbstractScrollArea::addScrollBarWidget ( QWidget * widget, Qt::Alignment alignment )
Re: QT eigenen Slider erstellen
hmm ok und was muss ein scrollbarwidget so alles können????
ich hab nunmal einfach mal folgendes gemacht:
Nun erscheint an der rechten!!!! seite ein Button. Eigentlich sollte er oben hin... Weiss jemand rat????
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);Re: QT eigenen Slider erstellen
Wie, was, rechte Seite? Oben?BDahl hat geschrieben:Nun erscheint an der rechten!!!! seite ein Button. Eigentlich sollte er oben hin... Weiss jemand rat????
Qt::AlignTop bezieht sich somit auf die vertikale Scrollbar, und sollte oberhalb dieser angezeigt werden.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.
Und was diese beiden Zeilen machen sollen, weiß ich nicht...
Code: Alles auswählen
vscroll->setParent(0);
...
w->setFixedHeight(height());Re: QT eigenen Slider erstellen
Das Besondere an dem Slider(vertikal) soll sein das unterhalb des Sliders noch 2 buttons liegen sollten
Vergessen, was du eigentlich wolltest oder auf dem ! eingeschlafen?un erscheint an der rechten!!!! seite ein Button. Eigentlich sollte er oben hin...
Re: QT eigenen Slider erstellen
also eigentlich sollte er auf der rechten seite liegen.
Dies tut er nur wenn ich verwende.
Bei dann erscheint er als Horizontale Bar.
ist es ein QT Fehler?????
Dies tut er nur wenn ich
Code: Alles auswählen
QT::AlignTopBei
Code: Alles auswählen
QT::AlignLeftist es ein QT Fehler?????
Re: QT eigenen Slider erstellen
Alsofranzf 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());
Code: Alles auswählen
vscroll->setParent(0)Code: Alles auswählen
w->setFixedHeight(height());Re: QT eigenen Slider erstellen
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.
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.
Re: QT eigenen Slider erstellen
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.BDahl hat geschrieben:Alsohängt die bisherige scrollbar aus, wenn ich die nicht aushänge, hängt qt irgendwie keine neue ein.Code: Alles auswählen
vscroll->setParent(0)
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...dient damit der button auf jedenfall eine fixe größe hat.Code: Alles auswählen
w->setFixedHeight(height());
Außerdem ist das ein ToolButton, der sollte doch eigentlich wissen, wie groß er sein soll?