存在qml文件无法调用pyd文件函数的问题。你知道吗
有几个文件:
一。主.py-&燃气轮机;python.exe运行条目
二。主控件.py->;显示我的项目.qmlui和setContextProperty我的项目.qml你知道吗
三。我的项目.qml->;单击鼠标区域时,将调用MyObect函数“cppMethod”和“cppSlot”主控件.py你知道吗
四。设置.py->;生成用于生成pyd的扩展文件
五。主控件.pyd->;由Cython生成
在主控件.py,有MyObject类,在这个类中,函数“cppMethod”和“cppSlot”将打印登录python.exe你知道吗
然后我调用“setContextProperty”函数将“myobject”注册到我的项目.qml以便我的项目.qml将识别“myobject”对象。你知道吗
当我跑的时候主.py在python.exe,它将显示一个小部件。 尝试点击这个小部件,它会调用MyObect函数“cppMethod”和“cppSlot”。成功了!!!你知道吗
它将显示:
qml: start
call the c++ method with Hello from QMLTest
call the c++ slot with 12345
qml: end
之后,我尝试保护代码,所以我使用Cython(和设置.py)“生成文件”主控件.pyd". 你知道吗
所以我换了主控件.pyd为了主控件.py. 你知道吗
当我跑的时候主.py与python.exe带“主控件.pyd,我在小部件中单击鼠标区域,它会显示
"TypeError: Property 'cppMethod' of object MyObject(0x21822d07430) is not a function".
意思是我的项目.qml无法识别“myobject”。你知道吗
有没有办法解决这个问题??如何解决这个问题??你知道吗
另外,我使用Python版本3.6.2,Qt版本5.6.2
你知道吗主.py你知道吗
import mainWidget
widget = mainWidget.main()
你知道吗主控件.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_())
你知道吗我的项目.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分开。你知道吗
相关问题 更多 >
编程相关推荐