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

有qml文件无法调用函数到pyd文件的问题。

有几个文件:

一世。 main.py-> python.exe运行条目

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

iii。 MyItem.qml->单击鼠标区域时,将在mainWidget.py中调用MyObect函数“ cppMethod”和“ cppSlot”

iv。 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")
        }
    }
}

setup.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 sqlite3数据库已锁定 - python

我在Windows上使用Python 3和sqlite3。我正在开发一个使用数据库存储联系人的小型应用程序。我注意到,如果应用程序被强制关闭(通过错误或通过任务管理器结束),则会收到sqlite3错误(sqlite3.OperationalError:数据库已锁定)。我想这是因为在应用程序关闭之前,我没有正确关闭数据库连接。我已经试过了: connectio…

Python:在不更改段落顺序的情况下在文件的每个段落中反向单词? - python

我想通过反转text_in.txt文件中的单词来生成text_out.txt文件,如下所示:text_in.txt具有两段,如下所示:Hello world, I am Here. I am eighteen years old. text_out.txt应该是这样的:Here. am I world, Hello old. years eighteen a…

用大写字母拆分字符串,但忽略AAA Python Regex - python

我的正则表达式:vendor = "MyNameIsJoe. I'mWorkerInAAAinc." ven = re.split(r'(?<=[a-z])[A-Z]|[A-Z](?=[a-z])', vendor) 以大写字母分割字符串,例如:'我的名字是乔。 I'mWorkerInAAAinc”变成…

如何在python中将从PDF提取的文本格式化为json - python

我已经使用pyPDF2提取了一些文本格式的发票PDF。我想将此文本文件转换为仅包含重要关键字和令牌的json文件。输出应该是这样的:#PurchaseOrder {"doctype":"PO", "orderingcompany":"Demo Company", "su…

查找字符串中的行数 - python

我正在创建一个python电影播放器​​/制作器,我想在多行字符串中找到行数。我想知道是否有任何内置函数或可以编写代码的函数来做到这一点:x = """ line1 line2 """ getLines(x) python大神给出的解决方案 如果换行符是'\n',则nlines …