2010-06-25 7 views
2

J'ai abandonné en essayant de le rendre plus rapide.QTextEdit.insertHtml() est très lent

Mon plus gros problème est que lorsque j'insère le code HTML, l'application ralentit à une analyse. je une barre de progression, et j'appelle

QCoreApplication.processEvents() 

(J'utilise PyQt, en passant)

Puis-je mettre insertHtml() dans un thread différent, donc je ne pas une interface qui ne répond pas? Comment pourrais-je m'y prendre? J'ai examiné QThread et QThreadPool, et je ne sais pas par où commencer.

+2

Je vous dis un secret. QPlainTextEdit :: setText() est aussi très lent. –

+0

QPlainTextEdit n'a pas de fonction setText(). Peut-être que vous voulez dire QTextEdit :: setText()? Cette fonction doit être évitée car, à chaque invocation, elle essaie de déterminer si le texte à insérer est du HTML ou du texte brut en examinant les caractères dans le texte. Au lieu de cela, utilisez setHtml() ou setPlainText(). À moins que vous n'utilisiez du HTML complexe, jetez un oeil à QPlainText qui supporte le HTML de base et est beaucoup plus rapide que QTextEdit. –

Répondre

2

Dans les applications de l'interface graphique, le thread principal est aussi appelé le fil GUI parce il est le seul fil qui est autorisé pour effectuer des opérations liées à l'interface graphique. - à partir du Qt Docs

Donc, non. Malheureusement, vous ne pouvez pas effectuer cette opération dans un thread.

Éditer: Techniquement, c'est possible. Je viens juste d'écrire un petit extrait, mais utiliser des objets Qt GUI de cette façon est très dangereux.

5

J'ai eu ce problème aussi bien, voici quelques choses que j'ai pour le rendre plus rapide:

TxtBrows->setAcceptRichText(false); 
TxtBrows->setContextMenuPolicy(Qt::NoContextMenu); 
TxtBrows->setOpenLinks(false); 
TxtBrows->setReadOnly(true); 
TxtBrows->setUndoRedoEnabled(false); 

Cela devrait se débarrasser des frais généraux inutiles.

également lors de l'insertion de grandes quantités de texte son bon pour désactiver les mises à jour de l'écran:

setUpdatesEnabled(false); 
    TxtBrows->append(SomeBigHTMLString); 
setUpdatesEnabled(true); 

Cela a été recommandé quelque part dans la documentation Qt, mais je ne peux pas trouver l'endroit tout à l'heure.

[Modifier] je suis tombé sur place dans les Docs (juste à temps pour eux d'être dépassés par QT5 Grinn) http://qt-project.org/doc/qt-4.8/qwidget.html#updatesEnabled-prop