From bd1f8841874643fb3e5718b3a24e882b460d0fdf Mon Sep 17 00:00:00 2001 From: RL-Xiang Date: Tue, 1 Sep 2026 18:29:28 +0800 Subject: [PATCH] =?UTF-8?q?=E6=B6=88=E9=99=A4VsCode=E8=AD=A6=E5=91=8A?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .qmllint.ini | 5 +++++ src/main.cpp | 17 ----------------- src/qml/.contextProperties.ini | 2 ++ src/qml/Main.qml | 27 ++++++++++----------------- src/qml/MainWindow.qml | 6 ------ src/qml/controls/Theme.qml | 1 - src/qml/windows/FancyWindow.qml | 29 +---------------------------- 7 files changed, 18 insertions(+), 69 deletions(-) create mode 100644 .qmllint.ini create mode 100644 src/qml/.contextProperties.ini diff --git a/.qmllint.ini b/.qmllint.ini new file mode 100644 index 0000000..9152946 --- /dev/null +++ b/.qmllint.ini @@ -0,0 +1,5 @@ +; qmllint 配置:集中管理警告级别,避免在代码里散落内联注释 +; 规则名与 qmllint --help 输出一致,级别可为 info / warning / error / disable +; 官方文档:https://doc.qt.io/qt-6/qtqml-tooling-qmllint.html#settings +[Warnings] + diff --git a/src/main.cpp b/src/main.cpp index 989c1a9..43570e0 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -8,29 +8,12 @@ int main(int argc, char *argv[]) app.setOrganizationName("FancyInput"); app.setApplicationName("FancyInput"); app.setApplicationVersion("1.2.0"); - - // 显式锁定 QuickControls2 风格为 Basic: - // 部署时裁剪掉了 Material/Universal/Imagine/FluentWinUI3, - // 若不显式指定,Qt 6.7+ 默认 FluentWinUI3,找不到会直接崩溃。 qputenv("QT_QUICK_CONTROLS_STYLE", "Basic"); - - // Qt 6 默认启用高 DPI 缩放,叠层/遮罩坐标后续用 devicePixelRatio 归一化 - QQmlApplicationEngine engine; - - // 关键:qt_add_qml_module 把 qmldir + QML 文件嵌入到 :/FancyInputQt/ 资源前缀下。 - // 必须把 qrc:/ 加入 import path,QML 引擎才能发现内嵌模块; - // 否则独立运行(无 build/ 下的磁盘模块目录)会报 - // "Module FancyInputQt contains no type named Main"。 engine.addImportPath(QStringLiteral("qrc:/")); - - // QML 加载失败时以非零码退出(Qt 6.5+ 推荐用法) QObject::connect(&engine, &QQmlApplicationEngine::objectCreationFailed, &app, []() { QCoreApplication::exit(-1); }, Qt::QueuedConnection); - - // 加载 MainWindow.qml(Window 壳,内含 Rectangle 根的主界面 Main.qml): - // 窗口级属性与内容自适应由 QML 侧处理,C++ 保持最简。 engine.loadFromModule("FancyInputQt", "MainWindow"); return app.exec(); diff --git a/src/qml/.contextProperties.ini b/src/qml/.contextProperties.ini new file mode 100644 index 0000000..c3762ef --- /dev/null +++ b/src/qml/.contextProperties.ini @@ -0,0 +1,2 @@ +[General] +disableUnqualifiedAccess = hostWindow diff --git a/src/qml/Main.qml b/src/qml/Main.qml index cdc91e5..b862489 100644 --- a/src/qml/Main.qml +++ b/src/qml/Main.qml @@ -11,40 +11,33 @@ Rectangle { width: 600 height: 480 color: Theme.background - property int clickCount: 0 + property Window settingsWindow: null + property Window overlayWindow: null - // 弹独立窗口:统一包装器现包装(等价 WPF 的 new SettingsWindow().Show()) - // 关键:createObject 的 parent 传 root(主窗口)→ FancyWindow 自动成为 - // transient parent 窗口(= WPF 的 Owner)。有了它: - // · 非模态:随主窗口最小化/关闭,任务栏不单列 - // · 模态:Qt.WindowModal 在同一窗口组内生效,主窗口被系统禁用, - // 点击主窗口时 Windows 自带标题栏闪烁反馈(同 WPF ShowDialog) function openSettingsWindow(modal) { - var win = settingsWindowComp.createObject(modal ? root : null, { modal: modal }) - if (win) win.show() + settingsWindow = settingsWindowComp.createObject(modal ? root : null, { modal: modal }) + if (settingsWindow) settingsWindow.show() } - // 打开无边框透明悬浮窗(WPF WindowStyle=None + AllowsTransparency + Topmost) function openOverlayWindow() { - var win = overlayWindowComp.createObject(null, {}) - if (win) win.show() + overlayWindow = overlayWindowComp.createObject(null, {}) + if (overlayWindow) overlayWindow.show() } - // 设置窗口:FancyWindow 包装 SettingsWindow 内容 + // 设置窗口 Component { id: settingsWindowComp FancyWindow { width: 480 height: 360 windowTitle: qsTr("设置 · FancyInput") - SettingsWindow { anchors.fill: parent - onCloseRequested: rootWindow.close() + onCloseRequested: hostWindow.close() } } } - // 悬浮窗:无边框 + 透明 + 置顶 + 工具窗(FancyWindow 一键配置) + // 悬浮窗 Component { id: overlayWindowComp FancyWindow { @@ -57,7 +50,7 @@ Rectangle { OverlayWindow { anchors.fill: parent - onCloseRequested: rootWindow.close() + onCloseRequested: hostWindow.close() } } } diff --git a/src/qml/MainWindow.qml b/src/qml/MainWindow.qml index 9c6db70..c765615 100644 --- a/src/qml/MainWindow.qml +++ b/src/qml/MainWindow.qml @@ -1,18 +1,12 @@ import QtQuick -import FancyInput.Controls import FancyInput.Windows -// 主窗口:用统一包装器 FancyWindow 包装主界面内容 -// 内容在 Main.qml(Rectangle 根,Qt Creator 可可视化编辑) -// main.cpp 通过 loadFromModule("FancyInputQt", "MainWindow") 加载本文件。 FancyWindow { id: win width: 600 height: 480 visible: true windowTitle: qsTr("FancyInput · Qt 迁移版(阶段 0)") - - // 内容组件:anchors.fill 跟随窗口缩放 Main { anchors.fill: parent } diff --git a/src/qml/controls/Theme.qml b/src/qml/controls/Theme.qml index 3984628..49ed4f0 100644 --- a/src/qml/controls/Theme.qml +++ b/src/qml/controls/Theme.qml @@ -1,7 +1,6 @@ pragma Singleton import QtQuick -// 主题:与 WPF 版保持一致 QtObject { readonly property color accent: "#651F65" readonly property color accentLight: "#8A3A8A" diff --git a/src/qml/windows/FancyWindow.qml b/src/qml/windows/FancyWindow.qml index f50e42f..4294d3a 100644 --- a/src/qml/windows/FancyWindow.qml +++ b/src/qml/windows/FancyWindow.qml @@ -1,35 +1,8 @@ import QtQuick -// 统一窗口包装器(等价 WPF 的 Window 类) -// -// 用法:内容组件一律保持 Rectangle 根(Qt Creator 设计模式可可视化编辑), -// 需要窗口时用本包装器现包装即可: -// -// FancyWindow { -// width: 480 -// height: 360 -// windowTitle: qsTr("设置") -// modal: true // 模态(WPF ShowDialog 等价) -// SettingsWindow { anchors.fill: parent } -// } -// -// // 无边框透明悬浮窗(WPF WindowStyle=None + AllowsTransparency + Topmost) -// FancyWindow { -// frameless: true -// transparent: true -// alwaysOnTop: true -// toolWindow: true -// OverlayWindow { anchors.fill: parent } -// } -// -// 子项(内容组件)直接写在包装器里即可 —— Window 的 data 默认行为 -// 会自动把 Item 子项挂到内容区(contentItem)。 Window { id: root - - // 内容组件可通过 rootWindow 访问包装器(如 rootWindow.close() 关窗) - // 固定别名,统一命名,避免每个包装处都要 id 转发 - property alias rootWindow: root + property alias hostWindow: root // ===== 窗口级属性(对齐 WPF Window) ===== property string windowTitle: "" // 标题(WPF Title)