QThread und QPixmap

Alles rund um die Programmierung mit Qt
Antworten
MisterJ
Beiträge: 21
Registriert: 20. November 2008 12:21

QThread und QPixmap

Beitrag von MisterJ »

Hallo Forenmitglieder,

ich habe in einer Anwendung einen QThread gestartet und diesem einen Pointer der aufrufenden Klasse übergeben und dann gestartet:
m_pDataThread = new DataThread(this);
m_pDataThread->start();
Wenn ich dann versuche, aus dem Thread einem Label ein Pixmap zuzuweisen, löscht er das vorher festgelegte Pixmap, läd aber auch nicht das neue.
DataThread::DataThread(QObject *parent)
: QThread(parent)
{
m_pStartClass = qobject_cast<StartClass*>(parent);
}

void DataThread::run(void)
{
m_pStartClass->setLabel(QPixmap(":/StartClass/Resources/picture.bmp"));
}
Wenn ich jedoch versuche, aus dem Thread einem Label einen Text zuzuweisen, dann funktioniert alles reibungslos.
Des Weiteren habe ich ein Event aus dem Thread übergeben, dass in der StartClass das Pixmap dem Label zuweisen soll, ebenfalls ohne Erfolg.
Testweise habe ich die Oberflächenklasse
Ui::StartClassTestClass ui;
als public definiert, so dass der Thread per Zeiger auf die StartClass ebenfalls auf die Oberflächenklasse zugreifen konnte.

In keinem der oben genannten Fälle war es mir möglich, einem Label per Befehl aus dem Thread ein anderes Pixmap zuzuweisen. Jedoch hat das Verändern eines Textes in einem Label immer funktioniert und auch das Ändern eines Pixmaps aus der StartClass ging ohne Probleme.

Kann mir jemand sagen, was ich falsch mache, bzw. was ich ändern muss?

Vielen Dank im Voraus

Johannes
pfid
Beiträge: 535
Registriert: 22. Februar 2008 16:59

Beitrag von pfid »

Hast du das mal per Signals & Slots versucht?
MisterJ
Beiträge: 21
Registriert: 20. November 2008 12:21

Beitrag von MisterJ »

Nein, habe ich noch nicht ausprobiert, werde ich aber mal machen, danke für den Tipp.

Jedoch wäre ich auch froh, wenn mir jemand sagen könnte, wieso meine oben beschriebenen Versuche nicht klappen.

Danke sehr.
Christian81
Beiträge: 7319
Registriert: 26. August 2004 14:11
Wohnort: Bremen
Kontaktdaten:

Beitrag von Christian81 »

Man kann aus einem Thread heraus keine GUI-Operationen durchführen. setLabel() könnte auch unter diesen Fall fallen, bin mir aber nicht sicher.
MfG Christian

'Funktioniert nicht' ist keine Fehlerbeschreibung
MisterJ
Beiträge: 21
Registriert: 20. November 2008 12:21

Beitrag von MisterJ »

Hallo Christian,

ja, ich weiß, dass das nicht geht, aber das habe ich (bis auf einen Testfall) nicht versucht. Ich rufe aus dem Thread eine Funktion der Startklasse auf, die wiederum das Label neu setzen soll. Diese Funktion ist somit keine Threadfunktion mehr.

Es muss aber doch eine Möglichkeit geben in irgendeiner Form ein Pixmap aus einem QThread heraus zu setzen.

Ich bin für jede Hilfe dankbar.

Johannes

Edit: Mit Signals and Slots hat es jetzt funktioniert.

Edit2: Es hat bei mir nur geklappt, wenn ich die Daten, die ich der Startklasse übergebe (Bildname, Labelname) vorher durch eine Funktion übergebe und danach ein Signal ohne Parameter auslöse. Mit Parametern funktioniert es nicht.
Antworten