qml文件无法调用pyd fi的函数

2024-10-05 15:26:45 发布

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

存在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")
)

Tags: 文件项目函数frompyimportgtcall
1条回答
网友
1楼 · 发布于 2024-10-05 15:26:45

Cython没有实现MOC,因此QML不能调用这些方法(如果检查生成的.c,就会发现除了MOC创建的@Slot之外,所有的东西都实现了)。你知道吗

一种解决方法是,在导入并使用插槽中的编译代码之后,将使用该插槽的代码与该部分中的cython分开。你知道吗

相关问题 更多 >