Bonjour,
Je réalise un programme et je dois générer un des images (QImage) dans un thread à partir d'un fichier XML. Par exemple :
J'ai donc un code qui ressemble +- à ceci :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8<book> <chapter> <page> <text>bla bla</text> <image path="illustration_intro.jpg" /> </page> </chapter> </book>
Avec le dessin de l'image je n'ai aucun problème, par contre lorsqu'il rencontre de drawText(), là mon application se coupe et j'ai le message :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30 void PageCreator::run() { QImage *image = new QImage(Page::width, Page::height, QImage::Format_RGB32); QPainter painter(image); QPen pen(Qt::white); painter.setPen(pen); QFont font("Verdana", 15, QFont::Bold); painter.setFont(font); QDomNode node = pageNode.firstChild(); while(!node.isNull()) { if(node.toElement().tagName() == "text") { QString test = "boum"; painter.drawText(10, 10, test); } else if(node.toElement().tagName() == "image") { QString path = node.toElement().attribute("path"); painter.drawImage(0, 0, QImage(path)); } node = node.nextSibling(); } this->page = new Page(this->num, image); }
Je n'ai trouvé de la documentation sur killTimers() uniquement pour Qt 3.3 (ici) alors que j'utilise Qt 4.5 et apparemment la méthode n'est plus disponible. Pour ceux que ça peut intéresser, voici le bout de code dans "gui\kernel\qapplication_win.cpp":ASSERT: "qApp && qApp->thread() == QThread::currentThread()" in file kernel\qapp
lication_win.cpp, line 902
This application has requested the Runtime to terminate it in an unusual way.
Please contact the application's support team for more information.
QObject::killTimers: timers cannot be stopped from another thread
Si je commente le drawText(), tout se passe parfaitement. Le drawPoint() ou drawRect() ne pose pas de problème non plus.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7 Q_GUI_EXPORT HDC qt_win_display_dc() // get display DC { Q_ASSERT(qApp && qApp->thread() == QThread::currentThread()); if (!displayDC) displayDC = GetDC(0); return displayDC; }
Merci de votre aide,
Sébastien
Partager