《二十一》QT QML編程基礎

QML概述

QML(Qt Meta-Object Language)是一種聲明性語言,它被用于描述Qt框架中用戶界面的結構和行為。QML提供了一種簡潔、靈活的方式來創建動態和交互式的界面。

QML基于JavaScript語法,通過使用QML類型和屬性來定義界面的元素和行為。它支持嵌套和組合,使開發人員可以輕松地創建復雜的界面和動畫效果。

與傳統的基于代碼的GUI開發相比,使用QML可以更快速地構建用戶界面,因為它提供了豐富的可重用組件和內置的動畫和過渡效果。此外,QML還支持跨平臺開發,使開發人員可以在不同的操作系統上重用他們的界面代碼。

QML廣泛用于Qt應用程序開發,特別是移動和嵌入式應用程序。它與C++代碼可以無縫地集成,使開發人員可以在QML界面中調用C++的功能和邏輯。

1.創建QML工程

1)新建工程
打開QtCreator10,依次點擊“Create Project” --> “Application(Qt)” --> “Qt Quick Application(compat)”
注意:本人打算使用Qt5.15.2創建工程,而非Qt6,因此選擇兼容低于Qt6版本的“Qt Quick Application(compat)”來創建

?后面正常就可以了。

2、編譯、運行

創建完成后,直接編譯、運行即可,默認界面如下:

3、代碼講解?

main.cpp詳解?

頭文件

#include <QGuiApplication>
#include <QQmlApplicationEngine>

?除了QQmlApplicationEngine其它頭文件很常見,QQmlApplicationEngine類下面會詳細講解

加載qml

下面的代碼等于 QQmlApplicationEngine engine(“qrc:/main.qml”);其它代碼是錯誤處理

    QQmlApplicationEngine engine;const QUrl url(QStringLiteral("qrc:/main.qml"));QObject::connect(&engine, &QQmlApplicationEngine::objectCreated,&app, [url](QObject *obj, const QUrl &objUrl) {if (!obj && url == objUrl)QCoreApplication::exit(-1);}, Qt::QueuedConnection);engine.load(url);return app.exec();

?

  1. 設置Qt應用程序的屬性,開啟高清晰度縮放功能;
  2. 創建QGuiApplication類的對象app,處理用戶界面事件和與操作系統的交互;
  3. 創建QQmlApplicationEngine類的對象engine,用于解析和加載QML文件;
  4. 定義一個url變量,用于指定QML文件的路徑;
  5. 連接engine的objectCreated()信號和app的exit()槽函數,以確保在對象創建失敗時退出程序;
  6. 調用engine的load()函數,從url指定的位置加載QML文件;
  7. 調用app的exec()函數,進入應用程序的事件循環,等待事件的發生并進行處理。

main.qml詳解

導入模塊
使用import來導入模塊,和include類似?

import QtQuick 2.12
import QtQuick.Window 2.12

?元素、屬性

Window {width: 640height: 480visible: truetitle: qsTr("Hello World")
}

Window即是種元素,常見的元素還有:Rectangle、Text、Button、Image、MouseArea、Item等
width、height、visible、title等皆為屬性,

添加代碼:矩形元素(Rectangle): Rectangle元素用于創建矩形區域,可以設置顏色、邊框、陰影等屬性。例如,下面的代碼創建了一個紅色的矩形:

import QtQuick 2.12
import QtQuick.Window 2.12Window {visible: truewidth: 640height: 480title: qsTr("Hello World")Rectangle {width: 200height: 100color: "red"}
}

?如圖:

再例如:

圖像元素(Image): Image元素用于顯示圖片,可以設置圖片的源文件、寬度、高度等屬性。例如,下面的代碼顯示了一個名為image.png的圖片:

import QtQuick 2.12
import QtQuick.Window 2.12Window {visible: truewidth: 640height: 480title: qsTr("Hello World")Image {source: "image.png"width: 200height: 200}
}

?

4、補充

4.1 元素列表

可在官網查看所有的元素:
Qt5:https://doc.qt.io/qt-5/qmltypes.html
Qt6:https://doc.qt.io/qt-6/qmltypes.html

4.2 屬性列表

以Window為例,Window的全部屬性可以在官網查看,Window屬性列表如下

active : bool			活動狀態
activeFocusItem : Item 	當前具有活動焦點的項目
color : color			窗口的背景顏色
contentItem : Item	 	場景中不可見根項目???
contentOrientation : Qt::ScreenOrientation
data : list<QtObject>	data 屬性允許您在一個窗口中自由混合可視子項、資源和其他窗口。
flags : Qt::WindowFlags
height : int
maximumHeight : int
maximumWidth : int
minimumHeight : int
minimumWidth : int
modality : Qt::WindowModality	窗口的形態
opacity : real		窗	口的不透明度
screen : variant		與窗口關聯的屏幕
title : string			窗口的標題
transientParent : QWindow	隨父窗口顯示或隱藏,如果設置為NULL,將獨立顯示
visibility : QWindow::Visibility	可見性是指窗口在窗口系統中是否應以正常、最小化、最大化、全屏或隱藏的方式顯示
visible : bool	窗口在屏幕上是否可見
width : int
x : int
y : int

QML事件處理

在QML中,可以通過處理鼠標事件、鍵盤事件以及使用輸入控件和焦點管理來實現事件處理。

鼠標事件處理: 在QML中,可以通過MouseArea元素來處理鼠標事件。以下是處理鼠標點擊事件的示例:

import QtQuick 2.12
import QtQuick.Window 2.12Window {visible: truewidth: 640height: 480title: qsTr("Hello World")MouseArea {anchors.fill: parent // 將MouseArea設置為與父元素相同大小onClicked: {console.log("Mouse clicked!")}}
}

?

?在上面的示例中,當鼠標在該矩形上點擊時,會觸發MouseArea的onClicked信號,從而打印出"Mouse clicked!"。

鍵盤事件處理: 在QML中,可以通過Item元素的Keys.onPressed或Keys.onReleased信號來處理鍵盤事件。下面是處理鍵盤按下事件的示例:

import QtQuick 2.12
import QtQuick.Window 2.12Window {visible: truewidth: 640height: 480title: qsTr("Hello World")Rectangle {width: 200height: 200color: "red"focus: true // 啟用焦點Keys.onPressed: {console.log("Key pressed:", event.key)}
}
}

在上面的示例中,當該矩形獲取焦點后,按下鍵盤上的任意鍵都會觸發Keys.onPressed信號,并打印出所按下的鍵所對應的ascll碼。

還有很多希望讀者更多探索!!!!!!

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/10705.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/10705.shtml
英文地址,請注明出處:http://en.pswp.cn/web/10705.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

基于 LlaMA 3 + LangGraph 在windows本地部署大模型 (三)

基于 LlaMA 3 LangGraph 在windows本地部署大模型 &#xff08;三&#xff09; 大家繼續看 https://lilianweng.github.io/posts/2023-06-23-agent/的文檔內容 第二部分&#xff1a;內存 記憶的類型 記憶可以定義為用于獲取、存儲、保留以及隨后檢索信息的過程。人腦中有多…

Mac 使用:Micosoft Remote Desktop 遠程優化

Micosoft Remote Desktop遠程優化 服務器 遠程會話環境設置 WinR打開運行&#xff0c;輸入gpedit.msc 找到計算機配置->管理模板->Windows組件->遠程桌面服務->遠程桌面會話主機->遠程會話環境。下面這幾個打開&#xff0c;有效提高rdp性能。 rdp協議同時使用…

自動駕駛---Behavior Planning之EUDM

1 背景 在前面的博客中,為讀者朋友們闡述了自動駕駛Planning模塊基于MCTS行為規劃的文章《自動駕駛---Behavior Planning之MCTS》,博客中引用的論文的主要思想是以蒙特卡洛樹來實現行為規劃。今天,我們繼續探尋另一種行為規劃的策略,主角依然是香港科技大學。 熟悉的讀者大…

vim 文件內容替換 cat 合并文件

vim 文件內容替換 第一步&#xff1a;首先要進入末行模式&#xff08;在命令模式下輸入冒號:&#xff09; 第二步&#xff1a;根據需求替換內容 ① 只替換光標所在這一行的第一個滿足條件的結果&#xff08;只能替換1次&#xff09; :s/要替換的關鍵詞/替換后的關鍵詞 回…

計數排序,基數排序,桶排序

目錄 計數排序: 基數排序&#xff1a; 桶排序: 計數排序: 計數排序是一種非比較型整數排序算法&#xff0c;特別適用于一定范圍內的整數排序。它的核心思想是使用一個額外的數組&#xff08;稱為計數數組&#xff09;來計算每個值的出現次數&#xff0c;然后根據這些計數信…

C語言中錯誤處理的基本實現

引入頭文件依賴&#xff1a; 標準輸入輸出流&#xff1a;#include <stdio.h>獲取錯誤信息&#xff1a;#include <string.h>&#xff0c;strerror通過這個頭文件獲取文件流&#xff1a;#include <stdlib.h>&#xff0c;fprintf通過這個頭文件獲取錯誤編號&…

hadoop生態圈集群搭建(持續更新240512)

Hadoop生態圈 Linux1.修改ip地址2.重啟network服務3.安裝插件4.關閉防火墻5.創建用戶6.創建目錄7.修改目錄的所屬主和所屬組為lxy8.修改主機名:hadoop102 (注意名字后面不要加空格)9.修改hosts文件10.等插件都裝完后再重啟Linux11.把xshell的登錄用戶換成lxy &#xff08;注意&…

【TC3xx芯片】TC3xx芯片時鐘監控

目錄 前言 正文 1.時鐘監控概念 1.1 時鐘監控原理 1.2時鐘監控配置寄存器

Node.js 的補充適用場景

Node.js 的適用場景相當廣泛&#xff0c;以下再補充一些具體的使用場景&#xff1a; 服務器端應用開發&#xff1a; Node.js特別適合于構建高性能、高并發、低延遲的服務器端程序。它可以用來開發Web服務器、API服務器、實時通訊服務器等。Node.js的高性能和事件驅動的非阻塞I…

day09-常用API異常

1.時間日期類 1.1 Date類&#xff08;應用&#xff09; 計算機中時間原點 1970年1月1日 00:00:00 時間換算單位 1秒 1000毫秒 Date類概述 Date 代表了一個特定的時間&#xff0c;精確到毫秒 Date類構造方法 方法名說明public Date()分配一個 Date對象&#xff0c;并初始化…

【大數據】HDFS

文章目錄 [toc]HDFS 1.0NameNode維護文件系統命名空間存儲元數據解決NameNode單點問題 SecondaryNameNode機架感知數據完整性校驗校驗和數據塊檢測程序DataBlockScanner HDFS寫流程HDFS讀流程HDFS與MapReduce本地模式Block大小 HDFS 2.0NameNode HANameNode FederationHDFS Sna…

使用注解的方式進行配置RabbitMQ

引入依賴&#xff1a; <dependency><groupId>org.springframework.amqp</groupId><artifactId>spring-rabbit-test</artifactId><scope>test</scope></dependency> 配置application.yml server:port: 8082 spring:rabbitmq…

pyqt5報錯:AttributeError: ‘mywindow‘ object has no attribute ‘setCentralWidget‘

第一種解決方法是&#xff1a;AttributeError: ‘mywindow‘ object has no attribute ‘setCentralWidget‘_attributeerror: mywindow object has no attribute-CSDN博客 第二種解決方法是&#xff08;推薦&#xff09;&#xff1a; 直接把這段代碼復制在 ui轉 py文件的后面…

什么是JVM中的程序計數器

在計算機的體系結構中&#xff1a; 程序計數器&#xff08;Program Counter&#xff09;&#xff0c;通常縮寫為 PC&#xff0c;是計算機體系結構中的一個寄存器&#xff0c;用于存儲下一條指令的地址。程序計數器是控制單元的一部分&#xff0c;它的作用是確保程序能夠按正確…

用 Python 和 AkShare 進行個股數據清洗:簡易多功能方法

標題:用 Python 和 AkShare 進行個股數據清洗:簡易多功能方法 簡介: 本文介紹了如何使用 Python 和 AkShare 庫對個股數據進行清洗和處理。個股數據經常需要進行清洗以用于分析、建模或可視化。我們將介紹一些簡單但功能強大的方法,包括數據加載、缺失值處理、重復值檢測和…

心理應用工具包 psychtoolbox 繪制小球走迷宮

psychtoolbox 是 MATLAB 中的一個工具包&#xff0c;對于科研人員設計實驗范式來說是不二之選&#xff0c;因為它可以操作計算機的底層硬件&#xff0c;精度可以達到幀的級別。 文章目錄 一、實驗目的二、psychtoolbox 的下載安裝三、Psychtoolbox 的基本使用四、完整代碼 一、…

不同數據類型的內部秘密----編程內幕(2)

Q&#xff1a; char類型是如何被當成int處理的&#xff1f; A: 我們可以看看char類型變量在何時才會被當做int處理. #include <stdio.h>int main() {char ch;ch a;printf("%c\n", ch);return 0; } 匯編代碼如下&#xff1a; hellomain:0x100000f60 <0&…

修改了環境變量~/.bashrc后 報錯 命令 “dirname” 可在以下位置找到 * /bin/dirname * /usr/bin/dirname

問題如下&#xff1a; 修改了~/.bashrc后加入了環境變量之后報錯&#xff0c;如下所示 (base) jiedell:~/桌面$ source ~/.bashrc 命令 “dirname” 可在以下位置找到 * /bin/dirname * /usr/bin/dirname 由于 /usr/bin:/bin 不在 PATH 環境變量中&#xff0c;故無法找到該…

在Linux上安裝并啟動Redis

目錄 安裝gcc環境 上傳redis文件方法一&#xff1a;sftp 上傳redis文件方法二&#xff1a;wget 啟動redis-server ctrlc關閉redis-server 參考文章&#xff1a;Linux 安裝 Redis 及踩坑 - 敲代碼的阿磊 - 博客園 (cnblogs.com) 準備&#xff1a;打開VMware Workstation&am…

pair對組創建

創建方式1: pair<type,type> p(value1,value2); pair<string, int> p("Tom", 20); cout << "name:" << p.first << "age:" << p.second << endl; 創建方式2: pair<type,type> pmake_pair(v…