Come faccio a sapere quando un PyQt-applicazione è inattiva?
-
21-08-2019 - |
Domanda
Mi piacerebbe sapere quando la mia applicazione è inattiva in modo che possa precaricare alcuni contenuti. C'è un evento o qualcosa di simile implementato in PyQt?
(potrei anche farlo con le discussioni, ma questo si sente come essere troppo complicato.)
Soluzione
Hai almeno due opzioni diverse, è possibile utilizzare un filo o utilizzare un timer. Classe QThread di Qt fornisce una proprietà di priorità che è possibile impostare per renderlo unico processo quando non altri thread sono in esecuzione, che comprende il filo GUI. L'altra opzione è un singolo temporizzatore colpo. Un QTimer con un timeout di 0 millisecondi pone un evento sul retro della coda degli eventi in modo che tutti gli eventi e le funzioni sincrone già attivi o programmati saranno trattati prima.
Nel codice, le due opzioni sarà simile al seguente:
// (1) use idle thread processing
MyQThreadSubclass idleThread;
idleThread.run(QThread::IdlePriority);
// (2) use QTimer::singleShot
QTimer::singleShot(0, receiver, SLOT(doIdleProcessingChunk));
Se si va con il singolo colpo QTimer, fare attenzione a quanto elaborazione voi fate come si può ancora bloccare il Gui. Faresti probabile che vuole romperlo in pezzi in modo che GUI non si avvia ad essere in ritardo:
// slot
void doIdleProcessingChunk() {
/* ... main processing here ... */
if (chunksRemain())
QTimer::singleShot(0, receiver, SLOT(doIdleProcessingChunk));
}
Ovviamente, quanto sopra è la sintassi C ++, ma per rispondere rispetto al PyQt, utilizzare il timer solo colpo. In Python, il globale blocco interprete è fondamentalmente andando a rendere gran parte della vostra concorrenza inutile se l'attuazione essere chiamato viene eseguita all'interno di Python.
È anche allora avete la scelta di utilizzare le discussioni Python o fili Qt, entrambi sono buone per motivi diversi.
Altri suggerimenti
Dai un'occhiata alla QAbstractEventDispatcher . Ma ... ho ancora suggerisco di utilizzare un filo. Motivi:
- Sarà portatile
- Se si commette un errore nel codice, il ciclo degli eventi sarà rotto -.> Si applicazione potrebbe bloccarsi, uscita tutto ad un tratto, etc
- Mentre il precarico accade, la vostra applicazione si blocca. Non ci sono eventi saranno trattati a meno che non si può precaricare il contenuto uno alla volta, sono tutti molto piccoli, di carico richiede solo pochi millesimi di secondo, ecc.
Con un filo e inviare un segnale al thread principale quando il contenuto è pronto. E 'molto più semplice.