【问题标题】:Get GUI element value from QThread从 QThread 获取 GUI 元素值
【发布时间】:2016-09-19 08:26:33
【问题描述】:

QThread 如何从 QLineEdit 中获取文本?

我尝试通过self.t.updateSignal.connect(self.inputedittext.text) 获取 QLineEdit 值,但出现错误:

TypeError:+= 不支持的操作数类型: PyQt4.QtCore.pyqtBoundSignal'和'int'

或者我收到消息:

0x02624580处xxxxxx的绑定信号updateSignal

代码:

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

【问题讨论】:

    标签: python pyqt4 signals-slots qthread


    【解决方案1】:

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

    【讨论】:

    • 谢谢 ekhumoro 它的工作,但这是同步 GUI 和 QThread 信号它可能从 GUI 给 self._count 值?需要这个 QThread 运行 7 次
    • @user1484400。抱歉,我不明白你在问什么。
    • 是我的错,你的帖子就是答案!
    猜你喜欢
    • 2015-05-29
    • 2013-04-21
    • 1970-01-01
    • 2019-08-20
    • 2020-03-11
    • 2013-03-03
    • 1970-01-01
    • 1970-01-01
    • 2021-07-28
    相关资源
    最近更新 更多