现代化QML组件开发教程
现代化QML组件开发教程
目录
- QML基础介绍
- QML项目结构
- 基本组件详解
- 自定义组件开发
- 状态与过渡
- 高级主题
- 最佳实践
QML基础介绍
什么是QML
QML (Qt Meta Language) 是一种声明式语言,专为用户界面设计而创建。它是Qt框架的一部分,让开发者能够创建流畅、动态的用户界面。QML与JavaScript紧密集成,这使得它既能以声明式方式描述UI元素,又能执行命令式逻辑。
QML vs 传统UI开发
相比传统的C++或其他语言UI开发,QML提供了更简洁、更直观的语法:
// 基本QML文件示例
import QtQuick 2.15
import QtQuick.Controls 2.15Rectangle {width: 300height: 200color: "lightblue"Text {anchors.centerIn: parenttext: "Hello, Modern QML!"font.pixelSize: 24}Button {anchors.bottom: parent.bottomanchors.horizontalCenter: parent.horizontalCentertext: "Click Me"onClicked: console.log("Button clicked!")}
}
设置开发环境
开始QML开发需要安装Qt框架和Qt Creator IDE。
- 访问Qt官网下载并安装Qt框架
- 安装过程中选择最新的Qt版本和Qt Creator
- 安装完成后,启动Qt Creator并创建一个新的Qt Quick应用程序
QML项目结构
典型项目文件结构
my-qml-app/
├── qml/
│ ├── main.qml # 应用程序入口QML文件
│ ├── components/ # 自定义组件目录
│ │ ├── MyButton.qml
│ │ └── MyHeader.qml
│ ├── views/ # 各个视图页面
│ │ ├── HomeView.qml
│ │ └── SettingsView.qml
│ └── styles/ # 样式相关文件
│ └── Style.qml
├── resources/ # 资源文件
│ ├── images/
│ └── fonts/
├── src/ # C++源代码
│ ├── main.cpp
│ └── backend/
├── CMakeLists.txt # CMake构建文件
└── qml.qrc # QML资源文件
资源管理
在现代QML应用中,资源通常通过Qt资源系统(.qrc
文件)进行管理:
<RCC><qresource prefix="/"><file>qml/main.qml</file><file>qml/components/MyButton.qml</file><file>resources/images/logo.png</file></qresource>
</RCC>
基本组件详解
Item
Item
是QML中最基本的视觉元素,它是所有视觉QML元素的基类。不渲染任何内容,但提供了位置、大小等基本属性。
Item {id: rootwidth: 100height: 100// 定位系统x: 50y: 50// 或使用锚点系统anchors.left: parent.leftanchors.top: parent.top
}
Rectangle
矩形是最常用的基本形状组件,可用于创建背景、卡片等。
Rectangle {width: 200height: 150color: "steelblue"radius: 10 // 圆角半径border.width: 2border.color: "darkblue"// 渐变背景gradient: Gradient {GradientStop { position: 0.0; color: "lightsteelblue" }GradientStop { position: 1.0; color: "steelblue" }}
}
Text
用于显示文本内容。
Text {text: "Modern QML Text"font.family: "Arial"font.pixelSize: 16color: "darkblue"// 文本对齐horizontalAlignment: Text.AlignHCenterverticalAlignment: Text.AlignVCenter// 文本换行wrapMode: Text.Wrapwidth: 200// 字体样式font.bold: truefont.italic: true// 文本阴影style: Text.RaisedstyleColor: "#80000000"
}
Image
用于显示图像。
Image {source: "qrc:/resources/images/logo.png" // 从资源文件加载// 或从网络加载// source: "https://example.com/image.jpg"width: 200height: 150// 缩放模式fillMode: Image.PreserveAspectFit// 图片加载状态处理onStatusChanged: {if (status === Image.Ready) {console.log("Image loaded successfully")} else if (status === Image.Error) {console.log("Error loading image")}}
}
MouseArea
让元素能够响应鼠标事件。
Rectangle {width: 100height: 100color: mouseArea.pressed ? "darkred" : "red"MouseArea {id: mouseAreaanchors.fill: parent // 填充父元素onClicked: console.log("Clicked!")onDoubleClicked: console.log("Double clicked!")hoverEnabled: trueonEntered: parent.color = "orange"onExited: parent.color = "red"}
}
QtQuick.Controls 2 组件
现代QML应用通常使用QtQuick Controls 2提供的控件,这些控件有更好的性能和样式定制能力。
import QtQuick 2.15
import QtQuick.Controls 2.15Column {spacing: 10Button {text: "Modern Button"onClicked: console.log("Button clicked")}Switch {text: "Enable feature"checked: trueonCheckedChanged: console.log("Switch state:", checked)}Slider {from: 0to: 100value: 50onValueChanged: console.log("Slider value:", value)}ComboBox {model: ["Option 1", "Option 2", "Option 3"]onCurrentIndexChanged: console.log("Selected:", currentIndex)}
}
自定义组件开发
创建自定义组件
在QML中,每个.qml
文件都可以成为一个可重用的组件。
例如,创建一个自定义按钮组件 MyButton.qml
:
// MyButton.qml
import QtQuick 2.15Rectangle {id: root// 导出的属性property string text: "Button"property color buttonColor: "steelblue"property color textColor: "white"property color hoverColor: Qt.lighter(buttonColor, 1.2)property color pressColor: Qt.darker(buttonColor, 1.2)// 导出的信号signal clickedwidth: buttonText.width + 40height: buttonText.height + 20color: mouseArea.pressed ? pressColor : mouseArea.containsMouse ? hoverColor : buttonColorradius: 5// 过渡动画Behavior on color {ColorAnimation { duration: 150 }}Text {id: buttonTextanchors.centerIn: parenttext: root.textcolor: root.textColorfont.pixelSize: 14}MouseArea {id: mouseAreaanchors.fill: parenthoverEnabled: trueonClicked: root.clicked()}
}
使用自定义组件
import QtQuick 2.15
import "./components" // 导入组件目录Item {width: 300height: 200MyButton {anchors.centerIn: parenttext: "Custom Button"buttonColor: "forestgreen"onClicked: console.log("Custom button clicked!")}
}
组件封装和重用
为了更好的可维护性,可以创建组件库。
例如,创建一个卡片组件 Card.qml
:
import QtQuick 2.15
import QtQuick.Layouts 1.15Rectangle {id: rootproperty string title: "Card Title"property alias content: contentContainer.childrenwidth: 300height: contentColumn.height + 20color: "white"radius: 8// 卡片阴影layer.enabled: truelayer.effect: DropShadow {transparentBorder: truehorizontalOffset: 2verticalOffset: 2radius: 8.0samples: 17color: "#30000000"}ColumnLayout {id: contentColumnanchors.fill: parentanchors.margins: 10spacing: 10Text {text: root.titlefont.bold: truefont.pixelSize: 16Layout.fillWidth: true}Rectangle {height: 1color: "#20000000"Layout.fillWidth: true}Item {id: contentContainerLayout.fillWidth: trueLayout.preferredHeight: childrenRect.height}}
}
使用这个卡片组件:
Card {title: "User Profile"content: Column {spacing: 5width: parent.widthText { text: "Name: John Doe" }Text { text: "Email: john@example.com" }MyButton {text: "Edit Profile"onClicked: console.log("Edit profile")}}
}
状态与过渡
状态管理
QML提供了强大的状态管理系统。
Rectangle {id: rectwidth: 100height: 100color: "red"states: [State {name: "normal"PropertyChanges { target: rect; color: "red"; width: 100 }},State {name: "highlighted"PropertyChanges { target: rect; color: "blue"; width: 150 }},State {name: "pressed"PropertyChanges { target: rect; color: "green"; width: 90 }}]state: "normal" // 默认状态MouseArea {anchors.fill: parenthoverEnabled: trueonEntered: parent.state = "highlighted"onExited: parent.state = "normal"onPressed: parent.state = "pressed"onReleased: parent.state = mouseArea.containsMouse ? "highlighted" : "normal"}
}
过渡动画
为状态变化添加平滑过渡效果。
Rectangle {// ...states 同上...transitions: [Transition {from: "*"; to: "*" // 应用于任何状态变化ColorAnimation { duration: 300 }NumberAnimation { properties: "width"; duration: 300;easing.type: Easing.OutQuad }}]
}
属性动画
直接为属性创建动画。
Rectangle {id: rectwidth: 100height: 100color: "red"// 行为动画:当属性变化时自动应用动画Behavior on width {NumberAnimation { duration: 300; easing.type: Easing.OutBack }}Behavior on color {ColorAnimation { duration: 300 }}MouseArea {anchors.fill: parentonClicked: {rect.width = rect.width === 100 ? 200 : 100rect.color = rect.color === "red" ? "blue" : "red"}}
}
复杂的动画序列
Rectangle {id: rectwidth: 100height: 100color: "red"MouseArea {anchors.fill: parentonClicked: animation.start()}SequentialAnimation {id: animation// 串行执行的动画ColorAnimation { target: rect; property: "color"; to: "blue"; duration: 500 }NumberAnimation { target: rect; property: "width"; to: 200; duration: 500 }// 并行执行的动画ParallelAnimation {NumberAnimation { target: rect; property: "height"; to: 200; duration: 500 }RotationAnimation { target: rect; property: "rotation"; to: 360; duration: 1000 }}// 重置PauseAnimation { duration: 500 }PropertyAction { target: rect; properties: "width,height,color,rotation"; value: 100 }}
}
高级主题
使用Qt Quick Layouts
Qt Quick Layouts提供了更灵活的布局系统。
import QtQuick 2.15
import QtQuick.Layouts 1.15Item {width: 400height: 300ColumnLayout {anchors.fill: parentanchors.margins: 10spacing: 10Rectangle {color: "steelblue"Layout.fillWidth: trueLayout.preferredHeight: 50}RowLayout {Layout.fillWidth: truespacing: 10Rectangle {color: "crimson"Layout.preferredWidth: 100Layout.fillHeight: true}Rectangle {color: "forestgreen"Layout.fillWidth: trueLayout.fillHeight: true}}Rectangle {color: "goldenrod"Layout.fillWidth: trueLayout.fillHeight: true}}
}
使用ListView和模型
import QtQuick 2.15
import QtQuick.Controls 2.15ListView {width: 300height: 400clip: true // 裁剪超出边界的内容// 使用ListModel作为数据源model: ListModel {ListElement { name: "Alice"; age: 25; role: "Developer" }ListElement { name: "Bob"; age: 32; role: "Designer" }ListElement { name: "Charlie"; age: 28; role: "Manager" }// 添加更多项...}// 使用代理定义列表项的外观delegate: Rectangle {width: ListView.view.widthheight: 60color: index % 2 === 0 ? "#f0f0f0" : "white"Column {anchors.verticalCenter: parent.verticalCenteranchors.left: parent.leftanchors.leftMargin: 10spacing: 2Text { text: name; font.bold: true }Text { text: "Age: " + age }Text { text: "Role: " + role; color: "darkgray" }}// 分隔线Rectangle {width: parent.widthheight: 1color: "#d0d0d0"anchors.bottom: parent.bottom}}// 滚动条ScrollBar.vertical: ScrollBar {}
}
使用JavaScript和后端集成
import QtQuick 2.15
import QtQuick.Controls 2.15Column {spacing: 10// JavaScript函数function calculateTotal(price, quantity) {return (price * quantity).toFixed(2);}// 本地数据存储property var productData: {"apple": { price: 1.20, stock: 50 },"banana": { price: 0.80, stock: 30 },"orange": { price: 1.50, stock: 25 }}ComboBox {id: productCombowidth: 200model: Object.keys(productData)}SpinBox {id: quantitySpinBoxfrom: 1to: productData[productCombo.currentText].stockvalue: 1}Button {text: "Calculate"onClicked: {let product = productCombo.currentText;let quantity = quantitySpinBox.value;let price = productData[product].price;resultText.text = "Total: $" + calculateTotal(price, quantity);}}Text {id: resultTextfont.pixelSize: 16}// 与C++后端交互的示例// 假设我们有一个C++类通过上下文属性暴露Button {text: "Save to Database"onClicked: {// 调用C++方法if (backend.saveOrder(productCombo.currentText, quantitySpinBox.value)) {resultText.text = "Order saved!";} else {resultText.text = "Error saving order!";}}}
}
响应式布局和自适应设计
import QtQuick 2.15
import QtQuick.Controls 2.15
import QtQuick.Layouts 1.15Item {id: rootwidth: 600height: 400// 检测屏幕大小property bool isMobile: width < 480// 在布局变化时响应onWidthChanged: updateLayout()onHeightChanged: updateLayout()function updateLayout() {console.log("Layout updated. Width:", width, "Height:", height);// 根据屏幕大小调整布局if (isMobile) {mainLayout.flow = GridLayout.TopToBottom;sidebar.Layout.preferredWidth = root.width;sidebar.Layout.preferredHeight = 100;} else {mainLayout.flow = GridLayout.LeftToRight;sidebar.Layout.preferredWidth = 200;sidebar.Layout.fillHeight = true;}}GridLayout {id: mainLayoutanchors.fill: parentflow: GridLayout.LeftToRightRectangle {id: sidebarcolor: "lightblue"Layout.preferredWidth: 200Layout.fillHeight: trueColumn {anchors.fill: parentanchors.margins: 10spacing: 10Text { text: "Navigation"; font.bold: true }Button { text: "Home"; width: parent.width }Button { text: "Profile"; width: parent.width }Button { text: "Settings"; width: parent.width }}}Rectangle {color: "white"Layout.fillWidth: trueLayout.fillHeight: trueText {anchors.centerIn: parenttext: "Main Content Area"font.pixelSize: 20}}}// 初始化布局Component.onCompleted: updateLayout()
}
主题和样式系统
// Style.qml - 集中定义主题和样式
pragma Singleton
import QtQuick 2.15QtObject {// 颜色readonly property color primaryColor: "#2196F3"readonly property color accentColor: "#FF4081"readonly property color backgroundColor: "#F5F5F5"readonly property color textColor: "#212121"readonly property color lightTextColor: "#757575"// 字体readonly property int smallFontSize: 12readonly property int normalFontSize: 14readonly property int largeFontSize: 18readonly property int titleFontSize: 22// 间距readonly property int spacing: 8readonly property int padding: 16// 圆角readonly property int cornerRadius: 4// 阴影readonly property color shadowColor: "#30000000"readonly property int shadowRadius: 8// 组件样式函数function buttonStyle(isPressed, isHovered) {return {color: isPressed ? Qt.darker(primaryColor, 1.2) :isHovered ? Qt.lighter(primaryColor, 1.1) : primaryColor,textColor: "white"}}
}
使用主题:
import QtQuick 2.15
import "styles" as AppStyleRectangle {width: 400height: 300color: AppStyle.Style.backgroundColorColumn {anchors.centerIn: parentspacing: AppStyle.Style.spacingText {text: "Styled Application"font.pixelSize: AppStyle.Style.titleFontSizecolor: AppStyle.Style.textColor}Rectangle {width: 200height: 50radius: AppStyle.Style.cornerRadiusproperty bool isHovered: mouseArea.containsMouseproperty bool isPressed: mouseArea.pressedcolor: AppStyle.Style.buttonStyle(isPressed, isHovered).colorText {anchors.centerIn: parenttext: "Themed Button"color: AppStyle.Style.buttonStyle(parent.isPressed, parent.isHovered).textColorfont.pixelSize: AppStyle.Style.normalFontSize}MouseArea {id: mouseAreaanchors.fill: parenthoverEnabled: trueonClicked: console.log("Clicked!")}}}
}
最佳实践
性能优化技巧
-
使用不可见元素的可见性绑定:
ListView {visible: model.count > 0 }
-
避免在高频率的处理器中使用昂贵的操作:
// 不好的做法 Timer {interval: 16 // 约60fpsrepeat: trueonTriggered: {// 执行昂贵的计算expensiveCalculation()} }// 更好的做法 Timer {interval: 100 // 降低频率repeat: trueonTriggered: {expensiveCalculation()} }
-
使用缓存属性:
property var cachedValue: expensiveFunction()function refreshIfNeeded() {if (needsRefresh) {cachedValue = expensiveFunction()} }
-
正确使用图层:
Rectangle {// 只有当需要特效时才启用图层layer.enabled: rotation != 0 || scale != 1layer.effect: DropShadow { ... } }
可维护性和可扩展性
-
组件化设计:
创建小型、专注的组件,每个组件只做一件事。 -
模块化文件结构:
按功能组织文件,例如将共享组件放在components
目录,视图放在views
目录。 -
命名惯例:
- 组件文件采用大驼峰命名法(如
MyButton.qml
) - 属性、函数和变量采用小驼峰命名法(如
buttonColor
,onClicked
) - 使用清晰、具描述性的名称
- 组件文件采用大驼峰命名法(如
-
文档化组件:
为组件添加清晰的注释,说明其用途、属性和事件。/*** 自定义按钮组件* * 提供一个具有悬停和按下效果的按钮* * @property string text - 按钮上显示的文本* @property color buttonColor - 按钮背景色* @signal clicked - 点击按钮时触发*/ Rectangle {// 组件实现... }
调试技巧
-
使用
console.log
进行调试输出:Component.onCompleted: {console.log("Component loaded, width:", width) }
-
使用Qt Quick Inspector:
Qt Creator包含一个用于调试QML的可视化工具。 -
使用属性绑定跟踪器:
import QtQml.Debugging 1.0Rectangle {BindingTracker {property var value: parent.widthonValueChanged: console.log("Width changed to:", value)} }
-
使用条件属性绑定进行调试:
width: {var w = container.width / 2;console.log("Calculated width:", w);return w; }
与C++集成
-
导出C++对象到QML:
// C++ class Backend : public QObject {Q_OBJECTQ_PROPERTY(QString userName READ userName WRITE setUserName NOTIFY userNameChanged)public:QString userName() const { return m_userName; }void setUserName(const QString &name) { if (m_userName != name) {m_userName = name; emit userNameChanged(); }}signals:void userNameChanged();private:QString m_userName; };// 注册到QML int main(int argc, char *argv[]) {QGuiApplication app(argc, argv);Backend backend;QQmlApplicationEngine engine;engine.rootContext()->setContextProperty("backend", &backend);// ... }
在QML中使用:
import QtQuick 2.15Text {text: backend.userName }
-
注册QML类型:
// 注册自定义类型 qmlRegisterType<CustomType>("MyApp", 1, 0, "CustomType");
在QML中使用:
import MyApp 1.0CustomType {// 使用自定义类型 }
这个教程涵盖了现代QML组件开发的核心概念和最佳实践。随着你的学习深入,建议查阅Qt官方文档获取更详细的API参考和示例。祝您的QML开发之旅愉快!
相关文章:
现代化QML组件开发教程
现代化QML组件开发教程 目录 QML基础介绍QML项目结构基本组件详解自定义组件开发状态与过渡高级主题最佳实践 QML基础介绍 什么是QML QML (Qt Meta Language) 是一种声明式语言,专为用户界面设计而创建。它是Qt框架的一部分,让开发者能够创建流畅、…...
DeepBook 与 CEX 的不同
如果你曾经使用过像币安或 Coinbase 这样的中心化交易所(CEX),你可能已经熟悉了订单簿系统 — — 这是一种撮合买卖双方进行交易的机制。而 DeepBook 是 Sui 上首个完全链上的中央限价订单簿。 那么,是什么让 DeepBook 如此独特&…...
《构建社交应用的安全结界:双框架对接审核API的底层逻辑与实践》
用户生成内容如潮水般涌来。从日常的生活分享,到激烈的观点碰撞,这些内容赋予社交应用活力,也带来管理难题。虚假信息、暴力言论、侵权内容等不良信息,如同潜藏的暗礁,威胁着社交平台的健康生态。内容审核机制…...
hashicorp vault机密管理系统的国产化替代:安当SMS凭据管理系统,量子安全赋能企业密钥管理
引言:国产化替代浪潮下的密钥管理新机遇 在数字化转型与信息安全自主可控的双重驱动下,企业级密钥管理市场正迎来前所未有的变革。传统海外解决方案如HashiCorp Vault虽功能强大,但在国产化适配、量子安全前瞻性布局等方面逐渐显现局限性。与…...
详解注意力机制
## 1. 引言 注意力机制(Attention Mechanism)是深度学习领域中的一项关键技术,最初源于人类视觉注意力的启发。在人类视觉系统中,我们能够快速识别图像中的重要区域,同时忽略不相关的部分。注意力机制将这种能力引入到…...
从 Vue3 回望 Vue2:响应式的内核革命
从 Vue3 回望 Vue2 02 | 响应式的内核革命:从 defineProperty 到 Proxy一、Vue2 的响应式系统:defineProperty 的极限边界1.1 基础实现机制1.2 Vue2 的典型痛点❌ 无法侦测新增属性❌ 无法拦截数组索引❌ 深层递归导致性能问题❌ 对象粒度低、不可统一代…...
[Java实战]Spring Boot 3构建 RESTful 风格服务(二十)
[Java实战]Spring Boot 3构建 RESTful 风格服务(二十) 一. 环境准备 openJDK 17:Spring Boot 3 要求 Java 17 及以上。Spring Boot 3.4.5:使用最新稳定版。Ehcache 3.10:支持 JSR-107 标准,兼容 Spring C…...
--openssl-legacy-provider is not allowed in NODE_OPTIONS 报错的处理方式
解决方案 Node.js 应用: 从 Node.js v17 开始,底层升级到 OpenSSL 3.0,可能导致旧代码报错(如 ERR_OSSL_EVP_UNSUPPORTED)。 通过以下命令启用旧算法支持: node --openssl-legacy-provider your_script.js…...
【MySQL】第三弹——表的CRUD进阶(一)数据库约束
文章目录 🚀数据库的约束<font color #FF0000 size3>约束类型:🪐<font color #FF0000 size3>①.NOT NULL非空约束🪐<font color #FF0000 size3>②.UNIQUE唯一性约束🪐<font color #FF0000 size3>③.DEFAU…...
python通过curl访问deepseek的API调用案例
废话少说,开干! API申请和充值 下面是deepeek的API网站 https://platform.deepseek.com/ 进去先注册,是不是手机账号密码都不重要,都一样,完事充值打米,主要是打米后左侧API Keys里面创建一个API Keys&am…...
哈希表:数据世界的超级索引
在数据的浩瀚宇宙中,哈希表就像是一座超级图书馆的索引系统,能够让我们瞬间找到所需的信息。作为 C 算法小白,今天我就带大家一起探索这座神奇的图书馆,揭开哈希表的神秘面纱。 什么是哈希表? 哈希表(Has…...
RDMA网络通信技术、NCCL集合通讯(GPU)
在高性能计算(HPC)、人工智能训练和数据密集型场景中,RDMA(远程直接内存访问) 和 NCCL(NVIDIA Collective Communications Library)是两项关键技术,用于优化节点间数据传输效率和大规…...
无人机失联保护模块技术解析!
一、技术要点 1. 信号监测与状态判断 实时信号质量评估:通过监测信号强度(RSSI)、误码率、信道质量等参数,动态判断是否触发失联保护。 多源冗余设计:结合GPS、视觉定位(如底部光学/红外传感器&#x…...
用自写的jQuery库+Ajax实现了省市联动
1. 省市联动:在网页上,选择对应的省份之后,动态的关联出该省份对应的市。选择对应的市之后,动态地关联出城市对应的区。 2. 设计数据库表 t_area (区域表) id(PK-自增) code name pcode ------------…...
Promise.all静态方法
由于是Promise类的静态方法 所以 使用类名.方法名() 的形式调用...
在Flutter上如何实现按钮的拖拽效果
1、使用 Draggable 和 DragTarget 配合一起使用 Draggable 定义可拖拽对象和拖动时,拖动对象的样子 DragTarget 定义拖拽后接收对象,可拿到Draggable携带的数据 import package:flutter/material.dart;class Test extends StatefulWidget {const Test({s…...
linux入门学习(介绍、常用命令、vim、shell)
文章目录 前言Linux介绍Linux内核版本Linux发行版本Linux的安装(仅作参考)Linux系统启动过程加载内核启动初始化进程init确定运行级别加载开机启动程序用户登录 Linux文件目录文件类型 Linux终端命令行格式查阅命令帮助信息tab键自动补全终端命令行中的常…...
archlinux中挂载macOS的硬盘
问: 你好,我如何在archlinux中挂载macOS的硬盘呢?/dev/sda4 5344161792 7813773311 2469611520 1.2T Apple HFS/HFS AI回答: 你好!在 Arch Linux 中挂载 macOS 的 HFS 或 HFS 硬盘(例如 /dev/sda4&#x…...
Java Web 应用安全响应头配置全解析:从单体到微服务网关的实践
背景:为什么安全响应头至关重要? 在 Web 安全领域,响应头(Response Headers)是防御 XSS、点击劫持、跨域数据泄露等攻击的第一道防线。通过合理配置响应头,可强制浏览器遵循安全策略,限制恶意行…...
Generative Diffusion Prior for Unified Image Restoration and Enhancement论文阅读
Generative Diffusion Prior for Unified Image Restoration and Enhancement 1. 论文的研究目标及实际意义1.1 研究目标1.2 实际问题与产业意义2. 论文的创新方法及公式解析2.1 核心思路2.2 关键公式与算法2.2.1 DDPM基础2.2.2 条件引导概率建模2.2.3 两种引导策略2.2.4 退化模…...
MongoDB 的主要优势和劣势是什么?适用于哪些场景?
MongoDB 的主要优势 (Advantages) 灵活的文档模型 (Flexible Document Model): 无需预定义模式 (Schemaless/Flexible Schema): 这是 MongoDB 最核心的优势之一。它存储 JSON 格式的文档,每个文档可以有不同的字段和结构。这使得在开发过程中修改数据结构非常容易&a…...
人脸识别备案:筑牢人脸信息 “安全墙”
人脸识别备案制度主要依据《人脸识别技术应用安全管理办法》建立,人脸识别技术广泛应用于安防、金融、门禁、交通等领域,带来便利高效的同时,人脸信息安全问题也引发担忧。为规范技术应用、保护个人信息权益,人脸识别备案制度应运…...
Excelize 开源基础库发布 2.9.1 版本更新
Excelize 是 Go 语言编写的用于操作 Office Excel 文档基础库,基于 ECMA-376,ISO/IEC 29500 国际标准。可以使用它来读取、写入由 Excel、WPS、OpenOffice 等办公软件创建的电子表格文档。支持 XLAM / XLSM / XLSX / XLTM / XLTX 等多种文档格式…...
工具类------对象与 Map 之间的相互转换
entity2Map - 将 Java 对象转换为 Mapmap2Entity - 将 Map 转换为 Java 对象 package com.toolconclusion.transition;import java.lang.reflect.Field; import java.lang.reflect.InvocationTargetException; import java.util.HashMap; import java.util.Map;public class E…...
BGP实验练习2
需求: 1.AS1存在两个环回,一个地址为192.168.1.0/24,该地址不能再任何协议中宣告 AS3存在两个环回,该地址不能再任何协议中宣告 AS1还有一个环回地址为10.1.1.0/24,AS3另一个环回地址是11.1.1.0/24 最终要求这两…...
centos7.x下,使用宝塔进行主从复制的原理和实践
操作原理: 一、主库配置 1.修改 MySQL 配置文件 # 编辑主库配置文件(路径根据实际系统可能不同) vim /etc/my.cnf # 添加以下配置 [mysqld] server-id 1 # 唯一 ID,主库设置为 1 log-bin mysql-bin …...
项目图标组件处理
我们如何复用项目里的图标,如何维护和引用图标? 为了形成便于使用的图标库,做了如下调研: iconfont(webfont)unocsssvgriconParkunplugin-icons 我们希望达到的目的 开发自行维护,而不是由设…...
el-tree结合checkbox实现数据回显
组件代码 <el-tree:data"vertiList"show-checkboxnode-key"id":props"defaultProps"ref"treeRefx"class"custom-tree"check-change"handleCheckChange"> </el-tree>获取选择的节点 handleCheckChan…...
虚拟机Ubuntu系统怎么扩展容量,扩展容量后进不去系统怎么办?
当我解压大文件时,突然报错,说我空间不足,我关闭虚拟机,删除了快照,在设置里点击扩展容量后,发现进不去系统了。 1.扩展容量 扩展容量需要关闭快照,请提前做好数据备份! 2.进不去界…...
道通EVO MAX系列无人机-支持二次开发
道通EVO MAX系列无人机-支持二次开发 EVO Max 系列采用Autel Autonomy自主飞行技术,实现复杂环境下的全局路径规划、3D场景重建、自主绕障和返航;高精度视觉导航能力,使其在信号干扰强、信号遮挡、信号弱等复杂环境下,依然获得高精…...
解构认知边界:论万能方法的本体论批判与方法论重构——基于跨学科视阈的哲学-科学辩证
一、哲学维度的本体论批判 (1)理性主义的坍缩:从笛卡尔幻想到哥德尔陷阱 笛卡尔在《方法论》中构建的理性主义范式,企图通过"普遍怀疑-数学演绎"双重机制确立绝对方法体系。然而哥德尔不完备定理(Gdel, 19…...
论文学习_Understanding the AI-powered Binary Code Similarity Detection
摘要:近年来,AI驱动的二进制代码相似性检测(Binary Code Similarity Detection, 简称 BinSD)已广泛应用于程序分析领域。该技术通过神经网络将复杂的二进制代码比较问题转化为代码嵌入向量之间的距离度量。然而,由于现…...
使用PHP对接日本股票市场数据
本文将介绍如何通过StockTV提供的API接口,使用PHP语言来获取并处理日本股票市场的数据。我们将以查询公司信息、查看涨跌排行榜和实时接收数据为例,展示具体的操作流程。 准备工作 首先,请确保您已经从StockTV获得了API密钥,并且…...
(vue)el-steps从别的页面跳转进来怎么实现和点击同样效果
(vue)el-steps从别的页面跳转进来怎么实现和点击同样效果 需求: 解决思路:监听路由,给active赋值对应下标 组件: <el-steps:active"active"finish-status"process"class"steps custom-steps":…...
什么是原码和补码
补码的本质确实是模运算(Modular Arithmetic),这是理解补码为何能统一加减法的核心数学原理。下面用最通俗的语言和例子解释清楚: —### 1. 先理解什么是“模运算”- 模运算就是“周期性计数”,比如钟表: -…...
vscode 同一个工作区,不同文件夹之间跳转问题
你说的问题,其实和 VS Code 的「工作区」机制、c_cpp_properties.json、compile_commands.json 或 LSP 后端(如 clangd)的索引行为有关。 ⸻ 📌 你的现象总结: 操作方式 是否能跳转 说明 打开整个上层文件夹&#x…...
嵌入式学习--江协51单片机day5
江协每个模块的学习都是第一集讲原理,第二集将简单应用。如果比较着急的,可以不看第一集,只要明白怎么用就行。 今天学习DS1302时钟和蜂鸣器 DS1302 内部原理图,DS1302是有内部电源,电源的引脚名要注意 这两个原理图…...
记录算法笔记(2025.5.13)二叉树的最大深度
给定一个二叉树 root ,返回其最大深度。 二叉树的 最大深度 是指从根节点到最远叶子节点的最长路径上的节点数。 示例 1: 输入:root [3,9,20,null,null,15,7] 输出:3 示例 2: 输入:root [1,null,2] …...
关于github使用总结
文章目录 一、本地使用git(一)创建一个新的本地Git库首先在本地创建一个新的git仓库然后进行一次初始提交提交过后就可以查看提交记录 (二)在本地仓库进行版本恢复先执行 git log 查看项目提交历史使用 git checkout 恢复版本 二、…...
进程与线程:09 进程同步与信号量
课程引入:进程同步与信号量 接下来这节课开始,我们再开始讲多进程图像。讲多进程图像的下一个点,前面我们讲清楚了多进程图像要想实现切换,调度是如何做的。同时,多个进程放在内存中,就会存在多进程合作的…...
鸿蒙 Core File Kit(文件基础服务)之简单使用文件
查看常用的沙箱目录 应用沙箱文件访问关系图 应用文件目录结构图 Entry Component struct Index {build() {Button(查看常用的沙箱目录).onClick(_>{let ctx getContext() // UI下只能使用这个方法,不能 this.contextconsole.log(--应用缓存文件保存目录&#x…...
游戏引擎学习第277天:稀疏实体系统
回顾并为今天定下基调 上次我们结束的时候,基本上已经控制住了跳跃的部分,达到了我想要的效果,现在我们主要是在等待一些新的艺术资源。因此,等新艺术资源到位后,我们可能会重新处理跳跃的部分,因为现在的…...
基于Win在VSCode部署运行OpenVINO模型
一、准备工作 1、Python 下载Win平台的Python安装包,添加环境变量,测试: python --version 在VSCode里( CtrlShiftP 打开命令面板),指定Python解释器为上面安装路径。写一个python脚本运行测试。 2、虚…...
关于maven的依赖下不下来的问题
相信大家对于maven下不下依赖会感到很烦,这里就来给大家进行解惑。 首先maven依赖报错基本是两种情况,一个是下载报错,这种情况就要考虑是否在maven的setting.xml文件中配了阿里云的相关配置没,其次就要检查是否真的存在这个依赖…...
按键精灵ios脚本新增元素功能助力辅助工具开发(一)
元素节点功能(iOSElement) 在按键精灵 iOS 新版 APP v2.2.0 中,新增了元素节点功能 iOSElement,该功能包含共 15 个函数。这一功能的出现,为开发者在处理 iOS 应用界面元素时提供了更为精准和高效的方式。通过这些函…...
【数据结构】——栈和队列OJ
一、有效的括号 题目链接: 20. 有效的括号 - 力扣(LeetCode) 题目的要求很简单,就是要求我们判断其输入的括号字符串是否是有效的括号,那么我们要如何判断呢? 我们可以这样,我们遍历出传入的…...
Windows部署LatentSync唇形同步(字节跳动北京交通大学联合开源)
#工作记录 一、前言 LatentSync:基于音频驱动的端到端唇形同步框架 LatentSync是由ByteDance开源的一个先进唇形同步框架,旨在通过音频条件驱动的潜在扩散模型实现高精度的唇形同步。与传统基于像素空间扩散或两阶段生成的方法不同,Late…...
MySQL:关系模型的基本理论
系列文章目录 1.关系模型的基本概念 2.数据库的完整性 文章目录 系列文章目录前言一、关系模型的基本概念 1.基本术语: 2.关系的特征二、数据库的完整性 1.常见用例:2.三类完整性原则3.MySQL提供的约束 三、触发器 1.触发器的定义 2.…...
9.1 C#控制SW中零件的变色与闪烁
本文介绍:装配件中某零件隐藏与显示、零件的颜色修改。 探讨本话题的目的是为了实现如下目的:如果某个气缸报警,那么3D中该气缸红色并闪烁。 目前,当勾选部件1闪烁时,零件1-1将在显示与隐藏之间闪烁。 示例代码放到如下位置: C#与solidworks示例1-零部件的显示与隐藏资源…...
Spring Boot 跨域问题全解:原理、解决方案与最佳实践
精心整理了最新的面试资料和简历模板,有需要的可以自行获取 点击前往百度网盘获取 点击前往夸克网盘获取 一、跨域问题的本质 1.1 什么是跨域? 跨域(Cross-Origin)问题源于浏览器的同源策略(Same-Origin Policy&…...