有2种方法:

一、 QML中定义一个信号,连接Python里的函数;

这里的函数不用特意指明为槽函数,普通函数即可。

QML的信号连接Python的函数

QML:
首先在QML中定义一个信号,这里的信号传递一个字符串给函数(信号可带参数也可不带):

signal mySignal(string my_string)

然后在click中发射这个信号:

onClicked:{
    root.mySignal("hello world")
}

Python:
使用QML里的信号连接Python里的函数:

engine.rootObjects()[0].mySignal.connect(my_func)  # 这里的mySignal是在QML里定义的

完整代码:
QML:

import QtQuick 2.12
import QtQuick.Controls 2.12

ApplicationWindow {
    id: root
    width: 250
    height: 500
    visible: true

    signal mySignal(string my_string)

    MouseArea {
        id: mouse_area
        anchors.fill: parent
        onClicked: {
            root.mySignal("hello world")
        }
    }
}

Python:

from PyQt5.QtCore import QObject
from PyQt5.QtGui import QGuiApplication
from PyQt5.QtQml import QQmlApplicationEngine
import sys


class MyWindow(QObject):
    def __init__(self):
        super().__init__()
        self.engine = QQmlApplicationEngine()
        self.engine.load('qml-test.qml')

        # root signal
        my_obj = self.engine.rootObjects()[0]
        my_obj.mySignal.connect(self.my_func)

    def my_func(self, my_string):
        print(my_string)


if __name__ == '__main__':
    app = QGuiApplication(sys.argv)
    window = MyWindow()
    sys.exit(app.exec())

 

二、 Python中定义一个类及槽函数,在QML中使用这个槽函数。

在QML中调用Python中的槽函数

首先需要在Python里定义一个类,在类里写一个槽函数:

 

 class Person(QObject):
    def __init__(self):
        super().__init__()

    @pyqtSlot()  # 注意是槽函数!
    def begin(self):
        print('begin')

 

然后通过setContextProperty将这个类设置为上下文的一个属性值:

person = Person()
engine.rootContext().setContextProperty('person', person)

QML文件里不需特别设置,直接调用函数即可。

完整代码:

Python:

from PyQt5.QtGui import QGuiApplication
from PyQt5.QtQml import QQmlApplicationEngine
from PyQt5.QtCore import QObject, pyqtSlot
import sys


class Person(QObject):
    def __init__(self):
        super().__init__()

    @pyqtSlot()  # 注意是槽函数!
    def begin(self):
        print('begin')


if __name__ == '__main__':
    app = QGuiApplication(sys.argv)
    engine = QQmlApplicationEngine()

    person = Person()
    engine.rootContext().setContextProperty('person', person)

    engine.load('qml-test.qml')
    sys.exit(app.exec())

QML:

import QtQuick 2.12
import QtQuick.Controls 2.12

ApplicationWindow {
    id: root
    width: 250
    height: 500
    visible: true

    Button{
            text:qsTr("begin")
            onClicked: {
                person.begin()
            }
    }
}

 

-- END --

 

posted @ 2019-09-26 11:04 ibg 阅读(2333) 评论(0) 推荐(0)
摘要: 1. 如何在python里获得qml里的对象? 1.1 获取根对象 QML: Python: 使用QQmlApplicationEngine类的rootObjects方法,返回的是一个列表,取索引0即是根对象。 这样就会获得id为window的ApplicationWindow对象。 1.2 获取任 阅读全文
posted @ 2019-09-25 16:04 ibg 阅读(2371) 评论(0) 推荐(1)
摘要: 一、使用Qt Designer 1、 直接引用ui文件: 2、将ui文件转为py文件: 然后引用demoLineEdit.py: 二、使用qml文件 备注:使用material style也可以用这个方法https://github.com/eyllanesc/stackoverflow/tree/ 阅读全文
posted @ 2019-09-02 16:22 ibg 阅读(1241) 评论(0) 推荐(0)
摘要: 环境:Windows 版 Python Python 3.6.8可以用自带的命令建立虚拟环境,不用安装另外的如 virtualenv、virtualenvwrapper等工具。 当这样建立了虚拟环境后,在其中安装的包很多,也很费时间,你想将这个MyApp放到其他电脑上去开发,是不是直接复制MyApp 阅读全文
posted @ 2019-09-01 12:22 ibg 阅读(10998) 评论(0) 推荐(1)
摘要: Windows 10 pomidor:https://github.com/TatriX/pomidor alert :https://github.com/jwiegley/alert toaster:https://github.com/nels-o/toaster 在Emacs里可以使用番茄工 阅读全文
posted @ 2019-01-06 19:01 ibg 阅读(854) 评论(0) 推荐(0)
摘要: virtualbox制作的镜像文件如果移动了位置,比如从C盘移到D盘,那么再次打开时会提示找不到文件。 解决办法: 打开virtualbox,在“管理”菜单中打开“虚拟介质管理”,在“虚拟硬盘”选项卡中能看到移动的vdi文件前有惊叹号,选择它点击“释放”,然后点击“删除”,再“应用”,退出这个界面。 阅读全文
posted @ 2018-07-07 10:06 ibg 阅读(7696) 评论(1) 推荐(1)
摘要: virtualbox 5.2.12 一台虚拟机是Debian 9,另一台是Ubuntu 18.04。 注意: 2台虚拟机系统里要安装ssh ! 然后在virtualbox里设置: 最后分别设置2台虚拟机 Debian 9: Ubuntu 18.04: 直接在图形界面里设置: -- End -- 阅读全文
posted @ 2018-06-14 11:31 ibg 阅读(1261) 评论(0) 推荐(0)
摘要: tmux版本(tmux 2.3): 要想让tmux和系统剪贴板之间互相复制粘贴,在linux中需要先安装 xclip: 然后在 .tmux.conf 文件中: 阅读全文
posted @ 2018-03-11 16:22 ibg 阅读(1715) 评论(0) 推荐(0)
摘要: Windows 10 将此内容保存为x.reg文件,然后双击文件导入注册表。注销或重启电脑即可生效。 Debian 9 在家目录下新建 .Xmodmap 文件,内容如下: 然后在终端中运行: 如果要自动运行则在 .xinitrc 文件中添加如下内容: -- END -- 阅读全文
posted @ 2018-03-10 13:07 ibg 阅读(748) 评论(0) 推荐(0)
摘要: 常用到的: list all non-stdlib packages : show all : 删除go get 安装的包(未测): 阅读全文
posted @ 2018-03-08 11:57 ibg 阅读(2722) 评论(0) 推荐(0)
点击右上角即可分享
微信分享提示