[gelöst]QLabel farbig gestallten

Alles rund um die Programmierung mit Qt
Antworten
daRonny
Beiträge: 23
Registriert: 21. November 2007 23:09
Kontaktdaten:

[gelöst]QLabel farbig gestallten

Beitrag von daRonny »

Hallo Leute,

ich hätte da mal ne Frage. Ich bekomme es überhaupt nicht hin mein QLabel eine Hintergrundfarbe zu verpassen. Unfassbar, ich liege auf dem Schlauch.

Meine Idee ist es aus einem QColorDialog mir eine Farbe auszusuchen und dem QLabel diese Farbe zu verpassen. Was ich bis jetzt nur schaffe ist es nur dem Text im Label zu verpassen.

Code: Alles auswählen

    mChangeColor = QColorDialog::getColor(mChangeColor, this); 
    
    QPalette *palette = new QPalette(mChangeColor); 
    //palette->setColor(QPalette::Window ,mChangeColor);
    mForm.label->setPalette(*palette);
Ich würde mich über Hilfe freuen

Gruß,
Ronny
Zuletzt geändert von daRonny am 10. Juni 2009 21:38, insgesamt 1-mal geändert.
franzf
Beiträge: 3114
Registriert: 31. Mai 2006 11:15

Beitrag von franzf »

Code: Alles auswählen

QColor windowColor = QColorDialog::getColor(initialColor);    // initialColor mitgeben, damit nicht irgendeine Farbe rauskommt, falls der Nutzer ohne Hirn auf OK drückt ;)
QPalette pal = mForm.label->palette();                                  // wir wollen nur die Hintergrundfarbe ändern und nich ne komplett andere, unpassende Palette setzen
pal.setColor(QPalette::Window, windowColor);
mForm.label->setPalette(pal);
So in etwa.
Sollte sich nix ändern, dann macht dein verwendeter Style irgend nen Mist und ignoriert/modifiziert die Hintergrundfarbe deines Labl beim zeichnen.
daRonny
Beiträge: 23
Registriert: 21. November 2007 23:09
Kontaktdaten:

Beitrag von daRonny »

Hey danke für deine Hilfe, doch ich muss leider sagen, dass es mir nicht weitergeholfen hat.
Er verändert einfach mein QLabel nicht. Das kann doch nicht sein, dass das ändern der Farbe eines Labels so schwer ist?
Zur Zeit:

Code: Alles auswählen

const QColor initColor(Qt::red);
mChangeColor = QColorDialog::getColor(initColor, this);  // Die Startfarbe des Dialoges ist nun rot, damit 
                                                                                    // nicht wie du sagst jemand einfach auf Ok klickt.

QPalette pal = mForm.label->palette();
pal.setColor(QPalette::Background, mChangeColor);   // Ich habe hier mal QPalette:: auf Background gesetzt. Nicht sicher was dahin muss :?.
mForm.label->setPalette(pal); 
Ich weiss echt nicht weiter... echt komisch.
franzf
Beiträge: 3114
Registriert: 31. Mai 2006 11:15

Beitrag von franzf »

Begrenze das Beispiel mal auf ein Minimum. Du arbeitest ja grad mit ner ui.

Versuchs mal mit folgendem Beispiel:

Code: Alles auswählen

#include <QtGui>

int main( int argc, char **argv )
{
    QApplication app( argc, argv );
    QLabel lbl("Hallo, neuer Hintergrund!");
    lbl.show();
    QPalette pal = lbl.palette();
    QColor newBg = QColorDialog::getColor(pal.color(QPalette::Window));
    pal.setColor(QPalette::Window, newBg);
    lbl.setPalette(pal);
    return app.exec();
}
Wenn der geht, weißt du dass es an deinem Code liegt.
Da schaust du dir selber alles nochmal genau an, reduzierst deinen Code aufs nötigste, und das kannst du dann hier posten, wenn du den Fehler nicht eh schon selber siehst.
daRonny
Beiträge: 23
Registriert: 21. November 2007 23:09
Kontaktdaten:

Beitrag von daRonny »

Das ist so unfair. Dein Code funktioniert natürlich einwandfrei.
Ja du hast recht, dass ich mit einer Gui arbeite. Aber ich habe dort nur den einen Button und ein Label mehr nicht. den Button connecte ich mit der Methode und dort habe ich dann das gleiche wie bei dir eingegeben.

liegt eventuell hier der Wurm? :
main.cpp

Code: Alles auswählen

#include "MainWindow.h"
int main(int argc, char* argv[])
{
    QApplication app( argc, argv);
    MainWindow window;
    window.show();
    return app.exec();
}
Wie du siehst, rufe ich hier den Konstruktor von MainWindow auf, wo ich ein connect habe der dann zu der Funktion führt, wo das alles mit dem Label passieren sollte. Gibt es eventuell ein Problem mit dem Label wenn er dann zurück kommt und window.show() macht?

MainWindow.cpp

Code: Alles auswählen

void MainWindow::changeColor()
{
    QPalette palette = mForm.label->palette();                   // mForm ist meine Gui alle andere ist genau wie dein Code der geht.
    QColor mChangeColor =  QColorDialog::getColor(palette.color(QPalette::Window));
    palette.setColor(QPalette::Window, mChangeColor);
    mForm.label->setPalette(palette);
}
Tut mir leid wenn ich dich so doll beanspruche.
Gruß[/code]
franzf
Beiträge: 3114
Registriert: 31. Mai 2006 11:15

Beitrag von franzf »

Kannst du mal bitte den Inhalt deines "MainWindow.h" posten?
Und bitte auch die Implementierung des MainWindo-Konstruktors.

Und beanspruchen ist wurscht. Wenn ich nicht wollte würd ich auch nicht antworten (ist ja alles freiwillig hier :P)

Grüße
Franz
daRonny
Beiträge: 23
Registriert: 21. November 2007 23:09
Kontaktdaten:

Beitrag von daRonny »

Der Inhalt vom "MainWindow.h":

Code: Alles auswählen

#include <QWidget>
#include "ui_view.h"

class MainWindow : public QMainWindow
{
    Q_OBJECT;

public:
   MainWindow();

protected:

public slots:
   void changeColor();

private:
   QColor mChangeColor;
   Ui::Form mForm;
};
Der Konstruktor:

Code: Alles auswählen

MainWindow::MainWindow()
{
    mForm.setupUi(this);
    connect(mForm.changeButton, SIGNAL(clicked()), this, SLOT(changeColor()));
}
Die changeColor Methode kennst ja unten schon ;).
franzf
Beiträge: 3114
Registriert: 31. Mai 2006 11:15

Beitrag von franzf »

Unter Windows kann es sein, dass du gar kein Glück haben wirst, denn da wird die Palette scheinbar ignoriert (les dir zum palette-property von QWidget mal die Doku durch).
mit dem Prop "autoFillBackground" bei dem label wird bei mir der Hintergrund in ner anderen Farbe gezeichnet, schaut aber kacke aus, da hier ein eigentlich schöner Farbverlauf durch eine platte, charakterlose, einfarbige Fläche ersetzt wird :D

Und wenn gar nix hilft, kannst du versuchen dem label einen styleSheet unterzujubeln, und darin die background-color entsprechend setzen.

Aber in jedem Fall komisch, dass das Setzen der Palette für ein Child-Widget beim Zeichnen ignoriert wird (egal welcher Style) :/

Grüße
Franz
upsala
Beiträge: 3946
Registriert: 5. Februar 2006 20:52
Wohnort: Landshut
Kontaktdaten:

Beitrag von upsala »

Ich würds ja einfach mal mit dem Designer testen...
daRonny
Beiträge: 23
Registriert: 21. November 2007 23:09
Kontaktdaten:

Beitrag von daRonny »

Hey, also danke nochmal für eure Hilfe. Ich habe das Problem nun mit dem StyleSheet gelöst.

Code: Alles auswählen

Label->setStyleSheet("QLabel{background-color: Rgb(100,255,0)}");
So klappt das doch schonmal top. Wenn ihr jetzt noch wisst, wie ich den QColor vom QColorDialog in den StyleSheet reinbekomme?
Kann man die Farbe aus dem "QColor" irgendwie zum Rgb umwandeln? Hatte in der Doku gesucht, aber nichts dazu gefunden.

Ansonsten danke nochmal für die Unterstützung. Menge dazugelernt.
franzf
Beiträge: 3114
Registriert: 31. Mai 2006 11:15

Beitrag von franzf »

daRonny hat geschrieben:Kann man die Farbe aus dem "QColor" irgendwie zum Rgb umwandeln? Hatte in der Doku gesucht, aber nichts dazu gefunden.
Direkt gibts wohl auch nix, aber es gibt ja QString, und QColor nach rgb() gibt halt nen int zurück. Außerdem kennt QColor auch red(), green() und blue().
Das schaut in python dann so aus:

Code: Alles auswählen

>>> c = QColor(255, 125, 125)
>>> cs = "rgb(" + QString.number(c.red()) + ", " + QString.number(c.green()) + ", " + QString.number(c.blue()) + ")"
>>> print cs
rgb(255, 125, 125)
War zu faul da extra mit C++ anzufangen, aber ich denke es ist klar wie es geht.

Grüße
Franz
Antworten