在GUI编程方面,我几乎是个初学者。 我将QT与python绑定(PyQT4)结合使用。
我要做的是:
QThread
设置为使用
皮瑟瑞。QThread
发送信号。并从
QThread
有信号。我基于这段代码(Link)启动了自己的测试实现。
在此之前,我阅读了关于QThread
s的基础知识,并试图理解它们的用途。
下面的测试代码是我想出的。很抱歉,我试着保持低调,
但仍然有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)
。这让我相信我错过了一些
重要的一点。
是什么原因造成的?
也许我采取了完全错误的方法?- 因此,如果你有更好的想法如何实现这一点,我将非常感谢听到它!
非常感谢!
一开始我只关注新的方法,从QT4开始应该如何使用
QThreads
(Link), 通过创建一个QObject
,然后调用moveToThread()
,很像我的第一个代码示例(至少我是这么理解的)。 但是我就是不明白,为什么我不能通过QThread
主要应用。因为我真的需要一个快速解决我的问题,我拼命尝试各种各样的事情。 下面是第二个代码,它看起来确实按我所希望的方式工作:
我现在认为这是一个解决办法,但它并不能真正回答我的问题。 另外,正如之前链接的QT博客中提到的, 这并不是使用
QThread
的真正目的。 因此,我仍然想知道如何让问题中的第一个代码按预期工作。 如果你知道我的第一个代码有什么问题,请告诉我!相关问题 更多 >
编程相关推荐