J'utilise un QWOBPAGE sans QWebView car je veux rendre le contenu d'un fichier HTML sur un QPIXMAP / QImage. p>
Je veux que le chargement de la page soit effectué de manière synchrone, pas em> asynchrone qui est la valeur par défaut. La manière par défaut consiste à appeler Je ne trouve pas un moyen de faire cela. Est-ce que je manque quelque chose? P> qwebframe :: Sethtml () code> ou
qwebframe :: setContent () code>, mais cela charge des images de manière asynchrone. Ce que je veux, c'est une sorte d'appel de la fonction de blocage, quelque chose comme
qwebframe :: Watintilloadfinished () code> après quoi je pourrais appeler
rendu () code> et être fait avec elle. p>
4 Réponses :
Cette approche a le problème que vous devez essentiellement attendre une durée indéterminée et si vous émettez l'appel du fil principal, vous bloquez le traitement des événements et que des signaux tels que pendant que vous pourrait em> se déplacer sur celui en pompant explicitement, je ne vois pas un problème inhérent qui pourrait vous empêcher d'émettre la charge de page et de faire le traitement lorsque LIBLAIRE CODE> . p>
LIBLEMIS. / code> eu lieu.
Si vous avez besoin de threads secondaires pour attendre la page, vous pouvez toujours laisser ces threads attendre à l'aide de mécanismes de synchronisation. P>
L'attente n'est pas un problème, les ressources sont du disque et je les contrôle. Ils sont très petits. Mais tu m'as donné une idée avec qfuturewatcher ...
De plus, je veux explicitement éviter d'attendre un signal. Je veux juste charger une petite page du disque, le rendre à une image et renvoie cette image. Cela devrait être une fonction, pas plusieurs + emplacement + attendant le signal, etc.
Comme Qt ne fournit pas cela lui-même, vous devez attendre le signal quelque part - même si c'est juste caché par un code. Je n'ai pas encore essayé de QTS Future Watcher, mais l'exemple semble pouvoir faire exactement ce que vous voulez - en attente de signaux.
Mais vous avez besoin de quelque chose qui retourne une qfuture, et rien dans qtwebkit ne le fait.
J'ai peut-être semblé tort alors - mais il y a d'autres mécanismes de synchronisation que vous pouvez utiliser pour une enveloppe.
Si quelqu'un est intéressé, j'ai mis en œuvre cela à l'aide d'une classe spéciale "Pageauserizerizer". P>
La classe crée un QWOBPAGE dans le constructeur et définit un drapeau de chargement bool sur false. Un Un Si vous êtes intéressé par le processus de rendu, consultez Cet exemple Qt (the Pour des points bonus, vous pouvez faire un coctural de classe A. P> Connect () CODE> Connecte connecte le signal code> loadfinished sur une fente membre qui définit simplement le drapeau de chargement sur true. P>
Renderpage () code> Fonction membre qui renvoie une image fait tout le travail: elle accepte la chaîne HTML et les appels
Sethtml () code>. Après cela vient un
pendant que code> boucle qui attend sur le drapeau; Pendant que le drapeau est faux,
qapp-> processivents () code> est appelé alors que les signaux sont émis et que le logement de configuration du drapeau est finalement appelé. Quand c'est le cas, la boucle se casse et maintenant vous pouvez rendre la page à un QIMAGE (n'oubliez pas de remettre le drapeau sur FALSE avant de revenir). P>
Thumbnailer :: Render () Code> Fonction). P>
Je recommande définitivement de ne pas utiliser de scrutin occupé via une boucle mais une synchronisation correcte comme des conditions d'attente.
Les signaux ne seront pas émis à moins que la boucle d'événement QT fonctionne. Mais la boucle d'événement traite les événements et revient ensuite. Ma solution exploite simplement le traitement de l'événement QT jusqu'à ce que WebKit soit effectué en charge. J'aimerais voir votre code à l'aide de QwaitConditions lorsque vous n'avez pas accès aux threads Webkit i> ...
J'ai dit Recommandez i> et bien sûr, je suppose que vous n'utilisez pas le fil principal en tant que fil de travailleur, ce qui signifie que vous n'avez tout simplement pas à sonder les événements manuellement.
J'espère que vous n'êtes pas de programmeur professionnel, Hotspinning est la pire chose que vous puissiez faire. Et un extrait d'Enipped aide souvent beaucoup plus que d'expliquer une structure difficile. Votre exemple ne nécessite pas de hotpinning non plus.
C'est à peine hotpinning, je suis simplement en cours d'exécution de la boucle d'événement QT.
Lucas, avez-vous de la chance d'avoir un exemple de code pour cette solution? Je rencontre un problème similaire avec Qtwebkit. Je charge des pages Web externes et il ralentit l'interface graphique jusqu'à ce que les pages soient finies. Je me rends compte que cette réponse a plus de 2 ans, mais elle a l'air prometteuse. Aucune suggestion?
Je vous suggère de le faire de la voie QT et de le faire async, cela aide un lot em>. p>
Si vous voulez toujours le faire en Sync, utilisez QEventloop dans un Séparez QThread . P>
Voir mon commentaire pour des informations détaillées sur l'utilisation de QThread.
Remarque: N'oubliez pas d'appeler MOVETOTHRead (); dans l'en-tête de fil ou tous les signaux passeront sur la boucle d'exécution de QApplication. P>
Voir maintenant C'est I> Informations utiles. Je ne savais pas à propos de Qeventloop. Maintenant, je peux le pousser à un nouveau fil et attendre que cela finisse.
Pour une utilisation appropriée QThread, voir lab.qt.nokia. COM / 2010/06/17 / Toi-faire-it-it-Ça
Si quelqu'un en a encore besoin, c'est comme ça que je l'ai eu du travail.
Pour être plus sûr, vous pouvez ajouter une seule minuterie avec un délai d'attente pour quitter la boucle d'événement si quelque chose ne va pas: qticer.singleshot (10000, boucle.quit)