Using a QThread in PyQT for serial communication (w. pyserial)

后端 未结 1 2051
醉酒成梦
醉酒成梦 2021-02-09 23:59

I am pretty much a beginner when it comes to GUI programming. I am using QT in combination with python bindings (PyQT4).

What I am trying to do:

1条回答
  •  星月不相逢
    2021-02-10 00:45

    At first I was only focussing on the new way, how QThreads should be used since QT4 (Link), by creating a QObject, and then invoking moveToThread(), pretty much like in my first code sample (at least thats how I understood it). However I just could not figure out, why I was not able to pass signals from the QThread to the main application.

    As I really needed a fast solution to my problem, I desperately tried varius things. Here is some second code, that does seem to work the way I wanted:

    from PyQt4 import QtCore, QtGui
    import time
    import sys
    import math
    
    
    class SerialCon(QtCore.QThread):
    
        received = QtCore.pyqtSignal(object)
    
        def __init__(self, parent=None):
            QtCore.QThread.__init__(self)
            # specify thread context for signals and slots:
            # test: comment following line, and run again
            self.moveToThread(self)
            # timer:
            self.timer = QtCore.QTimer()
            self.timer.moveToThread(self)
            self.timer.setInterval(800)
            self.timer.timeout.connect(self.readData)
    
        def run(self):
            self.timer.start()
            #start eventloop
            self.exec_()
    
        def readData(self):
            # keeping the thread busy
            # figure out if the GUI remains responsive (should be running on a different thread)
            result = []
            for i in range(1,1000000):
                result.append(math.pow(i,0.2)*math.pow(i,0.1)*math.pow(i,0.3))
            #
            self.received.emit("New serial data!")
    
        @QtCore.pyqtSlot(object)
        def writeData(self, data):
           #print(self.currentThreadId())
           print(data)
    
    class MyGui(QtGui.QWidget):
        serialWrite = QtCore.pyqtSignal(object)
    
        def __init__(self, app, parent=None):
           self.app = app
           super(MyGui, self).__init__(parent)
           self.initUI()
    
        def initUI(self):
           self.bSend = QtGui.QPushButton("Send",self)
           self.bSend.clicked.connect(self.sendData)
           self.show()
        def closeEvent(self, event):
            print("Close.")
            self.serialc.quit();
    
        @QtCore.pyqtSlot(object)
        def updateData(self, data):
            print(data)
    
        def sendData(self, pressed):
           self.serialWrite.emit("Send Me! Please?")
    
        def usingMoveToThread(self):
            self.serialc = SerialCon()
            # binding signals:
            self.serialc.received.connect(self.updateData)
            self.serialWrite.connect(self.serialc.writeData)
            # start thread
            self.serialc.start()
    
    if __name__ == "__main__":
        app = QtGui.QApplication(sys.argv)
        guui = MyGui(app)
        guui.usingMoveToThread()
        sys.exit(app.exec_())
    

    I consider it a workaround for now, but it does not really answer the question for me. Plus, as mentioned in the previously linked QT blog entry, it is not really the intended way to use the QThread. So I am still wondering how to get the first code in my question to work as expected. If you have some ideas about what is wrong with my first code, please let my know!

    0 讨论(0)
提交回复
热议问题