当前位置: 首页 > news >正文

QT实战经验总结 连载中

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.mrgr.cn/news/80854.html

相关文章:

  • 深入了解C++中const的用法
  • PostgreSQL和Postgis安装
  • 【Qt】QWidget中的常见属性及其功能(二)
  • 过山车:JAVA
  • idea | maven项目标红解决方案 | 强制刷新所有依赖
  • 写给Pythoner的前端进阶指南(一):前言-深入学习前端后会有哪些新的机遇
  • EE308FZ_Sixth Assignment_Beta Sprint_Sprint Essay 3
  • clickhouse-副本和分片
  • 【Java】4、虚拟机 JVM
  • 华为数通最新题库 H12-821 HCIP稳定过人中
  • Cocos Creator 试玩广告开发
  • Ubuntu24版 最新安装Nvidia显卡驱动方式
  • GIT命令使用手册(详细实用版)
  • Hive其一,简介、体系结构和内嵌模式、本地模式的安装
  • Android OpenGLES2.0开发(九):图片滤镜
  • 实现多条件搜索
  • 简易分页制作
  • 深入理解Kafka:核心设计与实践原理读书笔记
  • Redis 三种部署方式实践
  • 开发平台接口规范:北斗终端->北斗三号卫星->指挥机(北斗终端)->北斗短报文融合平台->客户平台(上行)| 时空信息产品
  • Java学习笔记(13)——面向对象编程
  • Electron -- Electron Fiddle(一)
  • Seatunnel 整合 xxl-job 实现批处理任务定时执行
  • springboot双数据源配置及进行数据库操作
  • Swin transformer 论文阅读记录 代码分析
  • 【Rust自学】4.2. 所有权规则、内存与分配