Forum: PC-Programmierung Qt: Farbe von label aus Thread setzen


von Bastler (Gast)


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

von Εrnst B. (ernst)


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)

von Bastler (Gast)


Lesenswert?

Εrnst B. schrieb:
> beim Ersten wird der Fehler nur
> nicht erkannt.

Es wird aber definitiv ausgeführt.

von Εrnst B. (ernst)


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.

von Bastler (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;

von Dirk (Gast)


Lesenswert?

Kannst Du bitte ein minimales und kompilierbares Beispiel anhängen, 
ansonsten ist das hier Rätsel raten.

von Εrnst B. (ernst)


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.

von Oliver S. (oliverso)


Lesenswert?

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

Da ist ein QLabel zu viel drin. So gehts (aus dem GUI-Thread)
1
label[i]->setStyleSheet("color :#ffffff");

https://doc.qt.io/qt-5/stylesheet-examples.html

Oliver
Nachtrag:
1
label[i]->setStyleSheet("color :#ffffff");

sollte doch funktionieren.

: Bearbeitet durch User
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.