gpt4 book ai didi

python - qml 文件无法调用 pyd 文件的函数

转载 作者:太空宇宙 更新时间:2023-11-03 21:25:02 26 4
gpt4 key购买 nike

存在qml文件无法调用pyd文件函数的问题。

有几个文件:

我。 main.py -> python.exe 运行入口

ii. mainWidget.py -> 显示 MyItem.qml ui 并将 setContextProperty 设置为 MyItem.qml

三. MyItem.qml -> 当您点击鼠标区域时,将调用 mainWidget.py 中的 MyObect 函数“cppMethod”和“cppSlot”

四。 setup.py -> 构建扩展文件以生成使用的 pyd

v. mainWidget.pyd -> 由 Cython 生成

在mainWidget.py中,有一个MyObject类,在这个类中,函数“cppMethod”和“cppSlot”将在python.exe上打印日志

然后我调用“setContextProperty”函数将“myobject”注册到MyItem.qml,以便MyItem.qml能够识别“myobject”对象。

当我在 python.exe 上运行 main.py 时,它将显示一个小部件。尝试单击此小部件,它将调用 MyObect 函数“cppMethod”和“cppSlot”。成功了!!!

它将显示:

qml: start
call the c++ method with Hello from QMLTest
call the c++ slot with 12345
qml: end

之后,我尝试保护代码,因此我使用 Cython(带有 setup.py)生成文件“mainWidget.pyd”。

所以我将 mainWidget.pyd 替换为 mainWidget.py。

当我使用带有“mainWidget.pyd”的 python.exe 运行 main.py 时,我单击小部件中的鼠标区域,它将显示

"TypeError: Property 'cppMethod' of object MyObject(0x21822d07430) is not a function".

这意味着 MyItem.qml 无法识别“myobject”。

有什么办法可以解决这个问题吗?如何解决这个问题?

ps。我使用Python版本3.6.2,Qt版本5.6.2

main.py

import mainWidget
widget = mainWidget.main()

mainWidget.py

import os
import sys
import PySide2
from PySide2.QtCore import *
from PySide2.QtGui import *
from PySide2.QtWidgets import QApplication, QWidget
from PySide2.QtQuickWidgets import *

class MyObject(PySide2.QtCore.QObject):
def __init__(self, parent=None):
super(MyObject, self).__init__(parent)

@PySide2.QtCore.Slot(str)
def cppMethod(self, msg):
print ("call the c++ method with ",msg)

@PySide2.QtCore.Slot(int)
def cppSlot(self, number):
print ("call the c++ slot with", number)

def main():
app = QApplication(sys.argv)
view = QQuickWidget()
myclass = MyObject()
view.rootContext().setContextProperty("myObject",myclass)
relativeUrl = QUrl(".//MyItem.qml")
view.setSource(relativeUrl)
view.show()
sys.exit(app.exec_())

MyItem.qml

import QtQuick 2.5
import QtQuick.Controls 1.5
import QtQuick.Layouts 1.3
import QtQuick.Controls.Styles 1.4
import QtQml 2.2

Item {
width: 100; height: 100
MouseArea {
anchors.fill: parent
onClicked: {
console.log("start")
myObject.cppMethod("Hello from QML")
myObject.cppSlot(12345)
console.log("end")
}
}
}

设置.py

from distutils.core import setup
from Cython.Build import cythonize

setup(
ext_modules = cythonize("mainWidget.py")
)

最佳答案

Cython 没有实现 MOC,因此 QML 无法调用这些方法(如果检查生成的 .c,会发现除了 MOC 创建的 @Slot 之外,所有内容都已实现)。

解决方法是在导入并使用槽中的编译代码后,分离使用该槽的代码并在该部分使用 cython。

关于python - qml 文件无法调用 pyd 文件的函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53911032/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com