从QThread获取GUI元素值

2024-04-18 18:49:04 发布

您现在位置:Python中文网/ 问答频道 /正文

QThread如何从QLineEdit获取文本?在

我试图self.t.updateSignal.connect(self.inputedittext.text)来获取QLineEdit值,但得到一个错误:

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()

Tags: textselfinitdefconnectstartqtguiqthread
1条回答
网友
1楼 · 发布于 2024-04-18 18:49:04

使用信号在线程到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()

相关问题 更多 >