Qt: Farbe von label aus Thread setzen

Gast #6447496
Lesenswert?
• ▲
▼
Warum kann ich aus einem Thread den Text eines labels verändern, nicht 
jedoch die Textfarbe?

Funktioniert:
1
label[i]->setText(strLang->mid(i, 1));

Funktioniert nicht:
1
label[i]->setStyleSheet("QLabel { color :#ffffff ; }");

Fehler: Cannot send events to object owned by a different thread
Lesenswert?
• ▲
▼
Ich würde sagen: Beides ist falsch, beim Ersten wird der Fehler nur 
nicht erkannt.

Wenn du wirklich Threads braucht (Rat für dich als blutigen Anfänger: 
Lern QT erstmal ohne) dann mach das per Signal-Slot connections. 
Entweder erkennt er per "Auto"-Mode dass die Objekte verschiedenen 
Threads gehören, und macht den Aufruf indirekt über eine Queue und die 
Main-Eventloop, oder du gibst das explizit beim connect vor. 
(connectionType=Qt::QueuedConnection)
Lesenswert?
• ▲
▼
Bastler schrieb:
> Es wird aber definitiv ausgeführt.

Ja. Kann ja sein, dass es funktioniert. Laut Dokumentation ist es aber 
falsch.
Fällt dir vielleicht bei der nächsten QT-Version, einer anderen 
Windows-Version, oder auf einem anderen OS auf die Füße.

Eine Schraube kann man auch mit dem Hammer in die Wand klopfen. Ist auch 
nicht richtig, obwohl es funktioniert.
Gast
Lesenswert?
• ▲
▼
Ich habe nun slots definiert:

public slots:
    void setText(int i, QString str);
    void setColor(int i);

Aber auch wenn ich diese vom Thread aufrufe, erhalte ich das selbe 
Verhalten, setText geht, setColor nicht.

Ich bin eigentlich kein GUI programmierer und möchte dort auch nicht 
groß einsteigen.

Ich habe einen Zeiger auf das Mainwindow, auf das greife ich vom Thread 
zu -> das ist garantiert auch falsch.

MainWindow * w;
Lesenswert?
• ▲
▼
Bastler schrieb:
> Ich habe nun slots definiert:

anders herum. das QLabel hat ja schon die beiden Slots.

Du musst in deinem Thread (oder einem QObject, was dem Thread "gehört") 
entsprechende Signals definieren.

dann verbinden
1
connect(this, SIGNAL(changeText(QString)),
2
  label[123], SLOT(setText(QString)),
3
  Qt::QueuedConnection);
,
und analog für das StyleSheet etc.

Ob man die Connection auch mit der QueuedConnection-Option per GUI im 
Designer zusammenklicken kann, weiß ich nicht.

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 6 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.