使用PySide2将python信号连接到qmlui插槽

2024-06-25 05:28:10 发布

您现在位置:Python中文网/ 问答频道 /正文

我刚刚开始为一个即将到来的项目使用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}$

Tags: coreselfreturnifdefpropertyvalfloat
1条回答
网友
1楼 · 发布于 2024-06-25 05:28:10

最简单的解决方案是使用连接,但是在PySide/PySide2的情况下,您无法获得参数,所以我将使用它们在this answer中所指的技巧。在

如果要发送一个点,那么使用QPoint,因为它直接转换为QML中的point类型。还必须计算最大值和最小值才能更新轴。在

考虑到上述情况,解决方案如下:

*.py

^{1}$

*.qml

^{pr2}$

enter image description here

相关问题 更多 >