Seite 1 von 1

Bildbearbeitung mit QThreads

Verfasst: 3. Januar 2007 14:34
von mheil
Hi,

in meinem Programm habe ich einen Thread welcher aus mehreren Grafiken eine neue Grafik erzeugen soll.
Hierzu benutze ich dort ein QPainter-Object, und zeichne damit die benötigten Teile der Grafiken in meine neue Grafik.
Das funktioniert soweit auch alles ganz prima, jedoch bekomme ich beim starten desd Programms die Meldung "QFont: It is not safe to use text and fonts outside the gui thread".

Meine Recherchen haben ergeben dass man keine QPixmaps und QFonts in ausserhalb des Main-Thread benutzen kann, aber das tue ich ja auch nicht.
In der Qt-Doku steht ausdrücklich dass man mit einem QPainter-Object in nicht-Gui-Threads auf QImage zeichnen kann (genau das was ich ja eigentlich auch mache).

Dasd ganze sieht dass so aus:

Code: Alles auswählen

void ImageMerger::run()
{
       QImage newImage(500, 500, QImage::Format_ARGB32_Premultiplied);

       QImage sourceImage;
       if(!sourceImage.load("testbild.png", "PNG"))
           qDebug() << "SourceImage could not be loaded";

       sourceImage = sourceImage.copy(source);
       sourceImage = sourceImage.scaled(sourceImage.size() * scale);

       QPainter painter(&newImage);
       painter.drawImage(insertionPoint, sourceImage);

        if(!newImage.save(QString("test.png"), "PNG"))
            qDebug() << "Image could not be saved";
}
Ich habe mich im Beispiel nur auf ein Bild bezogen welches geladen und geschrieben wird.
Die ausserhalb der run-methode findet sonst nichts weiter statt.
Die Klasse ImageMerger ist von QThread abgeleitet.

Ich frage mich wo da der Fehler liegen könnte.

Ich benutze Qt4.1.2/X11


Vielen Dank fürs lesen schon mal im Vorraus.

Verfasst: 3. Januar 2007 15:22
von Exolon
Der check bzgl. QFont/QThread wird eigentlich nur bei QPainter::drawTextItem gemacht. Innerhalb von drawImage wird die aber meines wissens nach nicht aufgerufen. Ich mach hier ganz ähnliches unter Qt 4.2.2 und hab die Warnung noch nicht zu gesicht bekommen. U.u. ist ein anderer Deiner Threads dran schuld?

Gruss

Exo

Verfasst: 3. Januar 2007 15:29
von mheil
Hmm.. einen anderen Thread habe ich nicht der das verursachen könnte.

Als ich weiter oben beschrieben habe dass ich mehrere Threads habe welche
die Bilder generieren meinte ich damit eigentlich nur dass ich mehrere Threads wie den oben habe.
Jeder einzelne von denen arbeitet halt eine Liste mit Bildern ab welcher er zu mergen hat.

Aber trotzdem danke für den Hinweis mit den QPainter::drawTextItem.

Ich denke ich werde mal versuchen den gleichen Code auf einer neueren QT-Version laufen zu lassen.
Vieleicht bringt das ja schon die erhoffte Erleuchtung.


mfg
Matthias