Skip to content

Instantly share code, notes, and snippets.

@ryonagana
Last active August 29, 2015 14:17
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save ryonagana/dd888b0c043c8f84471a to your computer and use it in GitHub Desktop.
Save ryonagana/dd888b0c043c8f84471a to your computer and use it in GitHub Desktop.
exemplo de qthread
import os
import sys
import time
from PyQt4 import QtGui as _qg
from PyQt4 import QtCore as _qc
'''
esta class é a classe da thread que vai rodar paralelamente
a thread principal da aplicação
'''
class MinhaThread(_qc.QThread):
_QTD = 0 # esta e uma variavel que vai ser incrementada quenquanto o loop roda na thread
'''
este é um QtSignal para facilitar a implementacao no python
usa o apelido de pyqtSignal
com ele voce deve definir o prototipo da funcao que vai ser repassado ao
evento que sera conectado nele
'''
'''
qc.pyqtSignal(int, str) porque vai ser passado um int e uma string na funcao
como ele foi traduzido do python os valores sao convertidos automaticamente
para os equivalentes em c++
antigamente tinha que escrever os signals usando tipos de dados do c++ diretamente
na signal no python, isso era ruim porque o tratamento das variaveis do c++ e python sao completamente
diferentes
era mais ou menos assim
sinalexemplo = QtCore.SIGNAL('sinalexemplo(int numero , QString msg)')
'''
sinalexemplo = _qc.pyqtSignal(int, str) #porque vou passar uma string e um int para a funcao!
#funcao para iniciar a thread
def start(self):
_qc.QThread.start(self)
def run(self):
#loop infinito que incrtemente _QTD
while(True):
#mensagem que é imitida
msg = "Mensagem de Teste";
#numero que é emitido
#lembrando que nosso signal espera um signal de int e string
self._QTD = self._QTD + 1
'''
aqui voce transmite os valores para o sinal
mas esses valores so é pego de volta
se o sinal estiver conectado a uma funcao
fora isso é ignorado
emit sempre aceita parametros identicos ao que foi definido no pyqtSignal
é como uma assinatura para repassar valores
'''
self.sinalexemplo.emit(self._QTD, msg)
time.sleep(1)
class Tela(_qg.QWidget):
def __init__(self, parent=None):
super().__init__()
self.resize(250, 150)
self.move(300, 300)
self.setWindowTitle('Simple')
'''
Inicia a thread
'''
self.proc = MinhaThread()
'''
starta a thread
'''
self.proc.start()
'''
esta funcao pega a thread com o signal e conecta a funcao
e todos valores emitidos na thread sao repassados para esta funcao
desde que ela carregue as mesma assinatura da signal
'''
self.proc.sinalexemplo.connect(self.pega_parametros)
#self.proc.exec
'''
aquio definimos a funcao
ela deve carregar o decorator de um slit com a mesma asinatura do pyqtSignal definido
é quase equivaliente em C como
typedef void (*sinalexemplo)(string msg, int num);
void pega_parametros(string msg, int num){
printf("mensagem %s e numero %d", msg, num);
}
sinalexemplo *slot;
slot = &pega_parametros;
slot("mensagem de teste", i++);
'''
@_qc.pyqtSlot(int, str)
def pega_parametros(self, msg, num):
print ("Mensagem {message} e Numero {number}".format(message=msg,number=num) )
if __name__ =="__main__":
app = _qg.QApplication(sys.argv)
#simulando aplicacao rodando indefinidamente
t = Tela()
t.showNormal()
app.exec_()
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment