GUIプログラミングに関しては、私はほとんど初心者です。QT を Python バインディング (PyQT4) と組み合わせて使用しています。
私がやろうとしていること:
QThread
pyserialを使用してシリアルポートから読み書きするように設定します。- メイン アプリケーションは、実行中の へのシグナルを介して新しいシリアル データを送信できる必要があります
QThread
。信号でからシリアル データを受信しQThread
ます。
このコード ( Link )に基づいて、独自のテスト実装を開始しました。これに先立って、s の基本を読み、QThread
それらがどのように使用されることを意図しているかを理解しようとしました。次のテストコードは、私が思いついたものです。申し訳ありませんが、最小限に抑えようとしましたが、それでも 75 行のコードです。
from PyQt4 import QtCore, QtGui
import time
import sys
class SerialData(QtCore.QObject):
def __init__(self, message):
super(SerialData, self).__init__()
self.__m = message
def getMsg(self):
return self.__m
class SerialCon(QtCore.QObject):
finished = QtCore.pyqtSignal()
received = QtCore.pyqtSignal(SerialData)
def init(self):
super(SerialCon, self).__init__()
# TODO setup serial connection:
# setting up a timer to check periodically for new received serial data
self.timer = QtCore.QTimer()
self.timer.setInterval(400)
self.timer.timeout.connect(self.readData)
self.timer.start(200)
# self.finished.emit()
def readData(self):
self.received.emit(SerialData("New serial data!"))
print "-> serial.readLine() ..."
@QtCore.pyqtSlot(SerialData)
def writeData(self, data):
print "-> serial.write(), ", data.getMsg()
class MyGui(QtGui.QWidget):
serialWrite = QtCore.pyqtSignal(SerialData)
def __init__(self):
super(MyGui, self).__init__()
self.initUI()
def initUI(self):
bSend = QtGui.QPushButton("Send",self)
bSend.clicked.connect(self.sendData)
self.show()
@QtCore.pyqtSlot(SerialData)
def updateData(self, data):
print "Gui:", data.getMsg()
def sendData(self, pressed):
data = SerialData("Send me!")
self.serialWrite.emit(data)
def usingMoveToThread():
app = QtGui.QApplication(sys.argv)
guui = MyGui()
thread = QtCore.QThread()
serialc = SerialCon()
serialc.moveToThread(thread)
# connecting signals to slots
serialc.finished.connect(thread.quit)
guui.serialWrite.connect(serialc.writeData)
serialc.received.connect(guui.updateData)
thread.started.connect(serialc.init)
thread.finished.connect(app.exit)
thread.start()
sys.exit(app.exec_())
if __name__ == "__main__":
usingMoveToThread()
私の問題:
SerialCon
テスト コードでは、オブジェクト ( に移動された)から送信された信号QThread
が、対応するスロット (MyGui
、updateData
)で受信されないようです。遅かれ早かれ、実行中のテスト コードは常に
Segmentation fault (core dumped)
. これは、私がいくつかの重要なビットを逃したと信じさせます.
何が原因でしょうか?
多分私は完全に間違ったアプローチを取っていますか?- それで、これを達成するためのより良いアイデアがあれば、それについて聞いてとても感謝しています!
どうもありがとう!