2016-10-13 2 views
0

J'ai un petit IDE pour un langage de modélisation que j'ai écrit, implémenté dans PyQt/PySide, et j'essaie d'implémenter un navigateur de code qui vous permet de sauter à différentes sections dans le fichier en cours d'édition.Puis-je retarder/regrouper les réactions aux événements QPlainTextEditor.textChanged?

L'implémentation actuelle est la suivante: (1) se connecter à QPlainTextEditor.textChanged, (2) chaque fois qu'un changement, (sloppily) analyser le fichier et mettre à jour le volet navigateur

Il semble fonctionner correctement, mais Je suis inquiet que cela pourrait causer des problèmes de performance majeurs pour les gros fichiers sur les systèmes plus lents, en particulier si plus de choses sont connectées à textChanged dans le futur. Ma question: Quelqu'un a-t-il mis en œuvre une réaction différée aux événements, de sorte que plusieurs événements (c'est-à-dire des frappes) sur une courte période déclenchent une seule mise à jour (disons une fois par seconde)? Et y a-t-il une bonne façon de faire cela?

Merci, Michael

Répondre

3

Vous pouvez essayer d'utiliser des minuteries si vous voulez un "retard".

Il y aurait deux façons de les utiliser (avec des résultats différents).


On est Parse seulement après aucune entrée n'a été fait pour un certain laps de temps

REMARQUE: Je sais que C++ Qt mais je suppose que les mêmes choses sont valables pour pyqt c'est si bon de "pseudocode" J'espère que vous obtenez le concept bien.

QTimer timer; //somewhere 
timer.setSingleShot(true); //only fire once 
connect(timer,QTimer::timeout(),OnTimerDone(...); 

OnTextChanged(...) 
{ 
    timer.start(500); //wait 500ms 
} 

OnTimerDone(...) 
{ 
    DoStuff(...); 
} 

Cela redémarre le minuteur chaque entrée, donc lorsque vous appelez et que la minuterie ne se fait pas le signal timeout n'est pas émis. Lorsqu'aucune entrée n'est effectuée pendant un certain temps, le temporisateur expire et vous analysez le fichier.


La deuxième option serait d'avoir une course minuterie périodique (singleShot(false)).

Il suffit de démarrer la minuterie pour chaque seconde. et timeout sera appelée une fois par seconde. Vous pouvez combiner cela avec une variable que vous définissez à true lorsque l'entrée est modifiée et à false lorsque le fichier est analysé. Donc vous évitez d'analyser quand rien n'a changé.

En C++ Qt, vous n'aurez pas à vous soucier du multithread, car le slot est appelé dans le thread graphique. Je suppose que c'est la même chose pour Python mais vous devriez probablement vérifier cela.

+0

Fonctionne magnifiquement, merci! (Je m'inquiétais d'utiliser des minuteurs parce que cela ressemblait à du piratage de quelque chose, mais c'est assez simple et élégant!) –

+0

@MichaelClerx merci pour le compliment :) ces choses sont l'une des utilisations usuelles des minuteurs. Parce que vous ne pouvez pas vraiment "dormir" dans une application graphique, les minuteurs sont le goto pour tout ce qui est lié au retard. – Hayt