QT实战经验总结 连载中

devtools/2024/12/22 8:43:25/

QT实战经验总结

  • 在看书系统学习后,就开始实战了,会遇到很多问题
    • 1.信号和槽的思考
    • 2.在python 或 C++ 代码中,对 QML 代码中控件的调用
    • 3.关于在一个窗口上不断打开新窗口

在看书系统学习后,就开始实战了,会遇到很多问题

python案例

1.信号和槽的思考

  • 当我练习简单的信号和槽的时候,只是 print 一些文字,所以我的槽函数没有封装到类中。但是当我做一些复杂操作时,我发现就得用类来封装起来。这里就涉及一个 engine.rootContext().setContextProperty("backend", backend)
    作用是让 backend 这个类,可以在 QML 中调用,因为类定义是在 python 中写的

  • 我在练习信号和槽的时候发现,我的python代码(后端)可以给QML代码(前端)发现号,而前端也可以给后端发现号。所以我发现这两中发现号的方式是不一样的。

    • 前端给后端发,常用的比如点击按钮,

      • 前端在你的 Button 中使用 onClicked{槽函数} 发射信号,对应的你的后端代码得有 @Slot() 来接收这个信号
    • 后端给前端发

      • 后端中使用 Signal() 发射信号,对应的前端得用 Connections 接收信号,Connections是专门监听后端信号的控件,它有监听目标 target 属性值和槽函数 function onFileSelected() 属性值

2.在python 或 C++ 代码中,对 QML 代码中控件的调用

刚开始写QT的时候,我就遇到这个问题
我在写后端逻辑时,会涉及到对前端 QML 控件的调用。
比如,我点击按钮,改变按钮或其他控件的属性。

这里需要用到的就是 engin.rootobject()[0].findChild(Object,"name")
engin 是用 python 时通过 QQmlApplicationEngine() 创造的对象。

  • rootObject()[0] 获取到根控件,就是 Window 控件(我以为它是以树形展开获取,但是我测试发现只能获取到根控件,就只有这一个)
  • findChild(Object,“name”) 就是从根控件 Window 找名为 name 的子控件。
//通过点击按钮来改变该按钮的文本
//只用函数实现不了,必须通过类才可以
//要注意的是代码都是写在 sys.exit(app.exec()) 前面的
from PySide6.QtGui import QGuiApplication
from PySide6.QtQml import QQmlApplicationEngine
from PySide6.QtCore import QObject, Slot
import sys
class Backend(QObject):def __init__(self, root_object, parent=None):super().__init__(parent)self.root_object = root_object@Slot()def say_hello(self):my_button = root_object.findChild(QObject, "myButton")if my_button:print("aaa",my_button.objectName())my_button.setProperty("text","bbb")
if __name__ == "__main__":app = QGuiApplication([])engine = QQmlApplicationEngine()  engine.load("qml/main.qml")if not engine.rootObjects():sys.exit(-1)root_object = engine.rootObjects()[0]backend = Backend(root_object)engine.rootContext().setContextProperty("backend", backend)sys.exit(app.exec())

3.关于在一个窗口上不断打开新窗口

在这里,你需要在主窗口的类中初始化其他的窗口,然后你要创建一些打开、关闭窗口的函数
需要用到的函数

self.first_window_component = QQmlComponent(self.engine)
self.first_window_component.loadUrl("test_window/first_window.qml")
if self.first_window_component.isReady():self.first_window = self.first_window_component.create()
else:print(self.first_window_component.errors())@Slot()
def show_first_window(self):self.first_window.setVisible(True)		@Slot()
def close_first_window(self):self.first_window.setVisible(False)    

http://www.ppmy.cn/devtools/144323.html

相关文章

Apache 如何监听多个端口 ?

Apache 是一个广泛使用的 web 服务器,可以配置为侦听多个端口。这对于托管多个网站、运行不同类型的服务或改进服务器的可访问性特别有用。在本文中,我们将探讨配置 Apache 以侦听多个端口的步骤。 Step 1: Access Apache Configuration File 找到并打…

uboot 打开log 的 方法

uboot 版本 commit f919c3a889f0ec7d63a48b5d0ed064386b0980bd (HEAD -> v2024.10, tag: v2024.10) Author: Tom Rini <trinikonsulko.com> Date: Mon Oct 7 08:54:35 2024 -0600 Prepare v2024.10 Signed-off-by: Tom Rini <trinikonsulko.com> 开启的选项…

Vue2/3 生命周期详细对比与使用指南

Vue 2 生命周期 Vue 2 中,生命周期是指组件实例在创建、挂载、更新、销毁时所经历的一系列过程。以下是 Vue 2 的生命周期图和主要钩子函数的描述: Vue 2 生命周期钩子 beforeCreate:实例初始化之后调用,数据观测和事件配置尚未完成。常用于初始化逻辑。created:实例创建…

文件防泄漏 | 文件防泄漏软件解决方案分享,网络数据泄露防护系统

文件防泄漏 | 文件防泄漏软件解决方案分享&#xff0c;网络数据泄露防护系统 企业面临的一大挑战是数据安全和隐私保护。 网络数据泄露不仅会导致经济损失&#xff0c;还会损害企业的声誉和客户关系。 为了应对这一挑战&#xff0c;域智盾软件应运而生&#xff0c;成为众多企…

【Flutter_Web】Flutter编译Web第二篇(webview篇):flutter_inappwebview如何改造方法,变成web之后数据如何交互

前言 欢迎来到第二篇文章&#xff0c;这也是第二个难题&#xff0c;就是原有的移动端本身一些页面H5的形式去呈现&#xff08;webview&#xff09;&#xff0c;例如某些需要动态更换内容的页面&#xff0c;某些活动页面、支付页面&#xff0c;不仅仅做页面呈现&#xff0c;还包…

2024年11月 蓝桥杯青少组 STEMA考试 Scratch真题

2024年11月 蓝桥杯青少组 STEMA考试 Scratch真题&#xff08;选择题&#xff09; 题目总数&#xff1a;5 总分数&#xff1a;50 选择题 第 1 题 单选题 Scratch运行以下程宇后&#xff0c;小兔子会&#xff08; &#xff09;。 A. 变小 B. 变大 C. 变色 D. …

在 .NET 5.0 运行 .NET 8.0 教程:使用 ASP.NET Core 创建 Web API

前言 因为我本机安装的是vs2019&#xff0c;所以我在使用vs创建项目的时候&#xff0c;只能选择.NET 5.0&#xff0c;而无法选择.NET 8.0 在网上有看到说用vs2019使用.net 8.0 &#xff0c;但是感觉不可靠&#xff0c;要用还是安装vs2022吧。 我因为不想要安装vs2022。 但是微…

Github 2024-12-17Python开源项目日报 Top10

根据Github Trendings的统计,今日(2024-12-17统计)共有10个项目上榜。根据开发语言中项目的数量,汇总情况如下: 开发语言项目数量Python项目10TypeScript项目1C++项目1Vue项目1稳定扩散Web UI 创建周期:512 天开发语言:Python协议类型:GNU Affero General Public License…