Last active
August 29, 2015 14:17
-
-
Save ryonagana/dd888b0c043c8f84471a to your computer and use it in GitHub Desktop.
exemplo de qthread
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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