我刚刚开始为一个即将到来的项目使用PySide2和QML,我马上就遇到了一个问题:如何将python类(继承自QObject)发出的信号连接到.QML文件中的插槽? 例如:我有一个QThread(python类),它每50毫秒生成一对xy坐标。我想将生成的耦合添加到QML文件中定义的LineSeries中,以便生成类似示波器的绘图。在
这个问题可能很简单,很愚蠢,但我真的需要一些帮助。在
谨致问候
兰多
编辑4:
我找到了一个解决办法,但我不太喜欢。你能给我建议一个更优雅的方法吗?在
Python代码:
class Manager(QObject):
dataReady = Signal(float,float)
def __init__(self):
QObject.__init__(self)
self._currX = 0
self._currY = 0
self._delay = 0.5
self._multiplier = 1.0
self._power = 1.0
self._xIncrement = 1.0
self._starter = False
self._threader = None
@Property(bool)
def starter(self):
return self._starter
@starter.setter
def setStarter(self, val):
print("New val: {0}, oldVal: {1}".format(val,self._starter))
if self._starter == val:
return
self._starter = val
if val:
self.start()
else:
self.stop()
@Property(float)
def multiplier(self):
return self._multiplier
@multiplier.setter
def setMultiplier(self, val):
if self._multiplier == val:
return
print(val)
self._multiplier = val
@Property(int)
def power(self):
return self._power
@power.setter
def setPower(self, val):
if self._power == val:
return
print(val)
self._power = val
@Property(float)
def delay(self):
return self._delay
@delay.setter
def setDelay(self, val):
if self._delay == val:
return
print(val)
self._delay = val
@Property(float)
def xIncrement(self):
return self._xIncrement
@xIncrement.setter
def setXIncrement(self, val):
if self._xIncrement == val:
return
print(val)
self._xIncrement = val
def generatePoint(self):
self._currX += self._xIncrement
self._currY = self._multiplier*(self._currX**self._power)
return self._currX,self._currY
def stop(self):
self._goOn = False
if self._threader is not None:
while self._threader.isRunning():
sleep(0.1)
def start(self):
self._goOn = True
self._threader = Threader(core=self.core)
self._threader.start()
def core(self):
while self._goOn:
x,y = self.generatePoint()
print([x,y])
self.dataReady.emit(x,y)
sleep(self._delay)
class Threader(QThread):
def __init__(self,core,parent=None):
QThread.__init__(self,parent)
self._core = core
self._goOn = False
def run(self):
self._core()
if __name__ == "__main__":
os.environ["QT_QUICK_CONTROLS_STYLE"] = "Material"
app = QApplication(sys.argv)
manager = Manager()
engine = QQmlApplicationEngine()
ctx = engine.rootContext()
ctx.setContextProperty("Manager", manager)
engine.load('main.qml')
if not engine.rootObjects():
sys.exit(-1)
sys.exit(app.exec_())
质量管理体系代码:
^{pr2}$
最简单的解决方案是使用连接,但是在PySide/PySide2的情况下,您无法获得参数,所以我将使用它们在this answer中所指的技巧。在
如果要发送一个点,那么使用QPoint,因为它直接转换为QML中的point类型。还必须计算最大值和最小值才能更新轴。在
考虑到上述情况,解决方案如下:
*.py
^{1}$*.qml
^{pr2}$相关问题 更多 >
编程相关推荐