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
#6447516
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)
#6447519
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 #6447527
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;
#6447566
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

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren