2016-09-19 5 views
1

어떻게 QThread가 QLineEdit에서 텍스트를 가져올 수 있습니까? QThread에서 GUI 요소 값 가져 오기

내가이 QLineEdit 값을 얻을 수 self.t.updateSignal.connect(self.inputedittext.text)을 시도하지만 오류 얻을 :

TypeError: unsupported operand type(s) for +=: PyQt4.QtCore.pyqtBoundSignal' and 'int'

또는 내가 메시지를 얻을 :

bound signal updateSignal of xxxxxx at 0x02624580

코드 :

import sys 
import time 
from PyQt4 import QtGui, QtCore 

class mc(QtGui.QWidget): 

    def __init__(self): 
     super(mc,self).__init__() 
     self.initUI() 

    def initUI(self): 
     self.setWindowTitle('QThread') 
     self.inputedittext = QtGui.QLineEdit() 
     self.startbutton = QtGui.QPushButton('start') 
     self.stopbutton = QtGui.QPushButton('stop') 
     self.textlable = QtGui.QLabel('0') 

     lv1 = QtGui.QVBoxLayout() 
     lb1 = QtGui.QHBoxLayout() 

     lb1.addWidget(self.inputedittext) 
     lb1.addWidget(self.startbutton) 
     lb1.addWidget(self.stopbutton) 

     lb2 = QtGui.QHBoxLayout() 
     lb2.addWidget(self.textlable) 

     lv1.addLayout(lb1) 
     lv1.addLayout(lb2) 

     self.setLayout(lv1) 

     self.t = test_QThread() 
     self.t.updateSignal.connect(self.inputedittext.text) 

     self.startbutton.clicked.connect(self.start_t) 
     self.connect(self.t,QtCore.SIGNAL('ri'),self.setlable) 

    def setlable(self,i): 
     self.textlable.setText(i) 

    def start_t(self): 
     self.t.start() 
     # print(self.inputedittext.text()) 


class test_QThread(QtCore.QThread): 
    updateSignal = QtCore.pyqtSignal(QtCore.QString) 

    def __init__(self): 
     QtCore.QThread.__init__(self) 

    def run(self): 
     i = self.updateSignal 
     # i=0 
     go = True 
     while go: 
      i+=1 
      time.sleep(1) 
      self.emit(QtCore.SIGNAL('ri'),str(i)) 
      print('run...') 




def main(): 
    app = QtGui.QApplication(sys.argv) 
    mw = mc() 
    mw.show() 
    app.exec_() 

if __name__ == '__main__': 
    main() 

답변

0

를 사용하여 신호를 스레드에서 GUI로, GUI에서 스레드로 통신하려면 :

class mc(QtGui.QWidget): 
    ... 

    def initUI(self): 
     ... 

     self.t = test_QThread() 
     self.t.progressSignal.connect(self.setlable) 
     self.t.requestSignal.connect(self.sendText) 

     self.startbutton.clicked.connect(self.start_t) 
     self.stopbutton.clicked.connect(self.stop_t) 

    def sendText(self): 
     self.t.updateSignal.emit(self.inputedittext.text()) 

    def setlable(self, i): 
     self.textlable.setText(str(i)) 

    def start_t(self): 
     self.t.start() 

    def stop_t(self): 
     self.t.stop() 


class test_QThread(QtCore.QThread): 
    requestSignal = QtCore.pyqtSignal() 
    updateSignal = QtCore.pyqtSignal(str) 
    progressSignal = QtCore.pyqtSignal(int) 

    def __init__(self, parent=None): 
     super(test_QThread, self).__init__(parent) 
     self.updateSignal.connect(self.updateSlot) 
     self._running = False 
     self._count = 0 

    def updateSlot(self, text): 
     print 'received: "%s", count: %d' % (text, self._count) 

    def stop(self): 
     self._running = False 

    def run(self): 
     self._count = 0 
     self._running = True 
     while self._running: 
      self._count += 1 
      time.sleep(1) 
      self.progressSignal.emit(self._count) 
      if self._count % 3 == 0: 
       self.requestSignal.emit() 
+0

에코모 감사합니다 그것은 작동하지만 그 GUI를 동기화하고 QThread 신호는 GUI에서 가능합니다 self._count 값을 제공합니까? 이 QThread가 7 번 – user1484400

+0

@ user1484400을 실행해야합니다. 미안 해요, 당신이 무엇을 요구하는지 이해가 안됩니다. – ekhumoro

+0

내 잘못이야, 네 게시물은 대답이야! – user1484400