尧图网络 高端网站定制 · 原创设计
免费咨询热线
400-888-6620
免费获取方案
基于QML的Windows 11风格虚拟键盘开发指南
你是否曾遇到过这样的场景在Windows 11的触摸屏设备上系统自带的屏幕键盘功能单一、响应迟缓或者在某些全屏应用如游戏、演示软件中系统键盘无法正常呼出对于开发者而言想要在自己的Qt/QML应用中集成一个美观、流畅的虚拟键盘却发现要么需要复杂的第三方库要么效果不尽如人意。今天我们直接解决这个痛点。我开源了一个使用QML语言开发的、高度模仿Windows 11设计风格的屏幕键盘项目。这不仅仅是一个“玩具”或Demo而是一个功能完整、可直接集成或独立运行的解决方案。它解决了原生键盘在自定义应用中的兼容性问题并为开发者提供了一个研究现代UI框架QML和跨平台界面开发的绝佳案例。本文将带你从零开始深入理解这个开源项目的核心价值、技术实现、以及如何将它应用到你的实际项目中。无论你是想直接使用这个键盘还是学习QML的高级UI开发技巧这篇文章都将提供清晰的路径和可落地的代码。1. 这个开源项目解决了什么问题在深入代码之前我们必须明确这个项目的核心价值。它瞄准了三个层面的需求1. 对最终用户的体验提升Windows 11的原生触摸键盘虽然功能强大但其设计语言固定且在某些特定场景如游戏全屏、老旧应用、远程桌面下存在兼容性问题或无法调用。一个独立的、风格统一的第三方键盘可以作为有效补充或替代。2. 对应用开发者的集成便利如果你正在开发一个基于Qt/QML的跨平台应用如信息亭系统、教育软件、工业控制界面并需要内置虚拟键盘这个项目提供了一个“开箱即用”的组件。你无需从零开始设计按键布局、动画效果和输入逻辑节省了大量开发时间。3. 对QML学习者的参考价值这个项目是学习QML高级特性的“活教材”。它涉及了复杂动态布局如何优雅地实现按键大小和布局的动态变化如Shift切换符号CapsLock切换大小写。流畅的动画与状态管理按键按下效果、键盘滑入滑出动画这些都依赖于QML的States、Transitions和Behavior。输入法与系统集成如何将虚拟按键的点击事件转化为真实的字符输入到系统的焦点控件中。现代化UI设计深度模仿Win11的亚克力Acrylic模糊背景、圆角、阴影和流畅的动画是学习现代GUI设计的优秀范例。因此这个项目不仅仅是一个“键盘”更是一个工程化、可复用的QML UI组件库。接下来我们将拆解它的技术内核。2. 核心概念与技术栈为什么是QML2.1 QML是什么QMLQt Modeling Language是一种声明式语言用于设计以用户界面为中心的应用程序。它允许开发者和设计师以更直观的方式构建流畅的动画和具有视觉吸引力的界面。其核心优势在于声明式语法和数据绑定使得UI逻辑与业务逻辑高度解耦。与传统的Qt Widgets基于C的指令式编程相比QML在创建动态、触摸友好的现代界面上具有压倒性优势。这正是我们选择QML来开发屏幕键盘的原因——我们需要高度动态的布局变化和丝滑的视觉反馈。2.2 项目技术栈解析本项目主要基于以下技术Qt 5.15 / Qt 6 跨平台应用框架。本项目理论上兼容这两个主要版本但推荐使用Qt 6以获得更好的性能和最新的QML模块支持。QML 用于构建所有UI组件包括键盘主界面、每个按键、背景面板等。JavaScript 在QML中内嵌使用用于处理复杂的按键逻辑、布局切换和输入事件分发。C (可选) 对于需要与操作系统底层输入法进行深度集成的功能如直接模拟硬件键盘事件可能需要通过C编写后端插件并通过Qt的机制暴露给QML前端。本开源项目的核心功能在纯QML/JS层面已实现。2.3 键盘的核心架构一个屏幕键盘可以抽象为以下几个层次渲染层QML负责绘制键盘的外观包括背景、按键形状、图标、文字。使用Rectangle、Image、Text等基础元素。逻辑层JavaScript负责管理键盘的状态。例如当前是英文模式还是中文模式CapsLock是否开启Shift键是否被按下根据这些状态决定渲染层显示哪个字符集。交互层QML Input Handlers负责接收触摸、鼠标点击事件并触发按键的“按下”和“释放”视觉效果。输出层系统集成负责将逻辑层确定的“字符”或“按键事件”如Enter, Backspace发送到当前获得焦点的系统输入框中。这通常通过Qt的Qt.inputMethod或模拟发送事件来实现。理解这个分层架构对于后续的代码阅读和自定义扩展至关重要。3. 环境准备与项目获取在开始运行和修改代码前你需要搭建基础的开发环境。3.1 开发环境要求操作系统 Windows 10/11, macOS, 或 Linux (理论上跨平台但UI风格针对Win11优化)。Qt SDK 推荐安装Qt 6.5或更高版本。你可以从 Qt官网 下载开源版本或商业版本。安装时请确保勾选以下组件Qt 6.x.x (如 MSVC 2019 64-bit 或 MinGW 64-bit)Qt Creator (集成开发环境)编译器 如果选择Windows建议安装MSVC 2019或MinGW。Qt安装程序通常会包含。Git 用于克隆代码仓库。3.2 获取开源代码项目已托管在GitHub上。打开终端或Git Bash执行以下命令克隆项目git clone https://github.com/mewamew/my_ai_town.git cd my_ai_town请注意根据提供的网络热词项目链接是https://github.com/mewamew/my_ai_town。这是一个名为“My AI Town”的仓库。屏幕键盘项目可能是该仓库中的一个子项目或示例。克隆后你需要在仓库目录中寻找与屏幕键盘相关的QML文件通常文件名包含keyboard、virtualkeyboard等。如果键盘项目是独立的作者可能会提供单独的仓库链接。假设我们在my_ai_town仓库的virtual_keyboard目录下找到了核心代码。我们以此为基础进行讲解。3.3 使用Qt Creator打开项目启动Qt Creator。点击文件-打开文件或项目。导航到克隆的仓库目录找到项目配置文件通常是.pro文件或CMakeLists.txt文件。如果键盘是子模块可能需要打开主项目文件。点击打开Qt Creator会自动配置套件Kit。确保它使用了正确的Qt版本和编译器。配置完成后点击左下角的绿色三角按钮或按CtrlR来构建并运行项目。4. 核心QML组件拆解让我们深入到QML代码中看看一个现代化的虚拟键盘是如何构建的。我们将聚焦于几个核心文件。4.1 主键盘界面 (MainKeyboard.qml)这个文件定义了键盘的整体布局和容器。// File: virtual_keyboard/MainKeyboard.qml import QtQuick 2.15 import QtQuick.Controls 2.15 import QtQuick.Layouts 1.15 Popup { id: keyboardPopup width: 800 height: 300 modal: false // 非模态允许点击键盘外区域 focus: true // Win11风格的亚克力背景 background: Rectangle { color: Qt.rgba(0.98, 0.98, 0.98, 0.85) // 浅色半透明 radius: 8 layer.enabled: true layer.effect: OpacityMask { maskSource: Rectangle { width: keyboardPopup.width height: keyboardPopup.height radius: 8 } } // 背景模糊效果 (Qt 6.5 支持 BackdropBlur) BackdropBlur { anchors.fill: parent source: parent radius: 32 visible: Qt.platform.os windows // 可根据平台调整 } } // 键盘内容区域 ColumnLayout { anchors.fill: parent anchors.margins: 10 spacing: 5 // 第一行功能键 (Esc, F1-F12等示例中简化为一行字母) RowLayout { Layout.fillWidth: true spacing: 4 Repeater { model: [Q, W, E, R, T, Y, U, I, O, P] delegate: KeyButton { keyText: modelData Layout.fillWidth: true Layout.preferredHeight: 50 } } } // 第二行、第三行... 类似布局 // 最后一行空格键行 RowLayout { Layout.fillWidth: true spacing: 4 KeyButton { keyText: Ctrl; isModifier: true; Layout.preferredWidth: 80 } // ... 其他键 KeyButton { id: spaceBar keyText: displayText: 空格 Layout.fillWidth: true Layout.preferredHeight: 50 } // ... 其他键 KeyButton { keyText: ←; isSpecial: true; Layout.preferredWidth: 80 } } } // 键盘弹出/隐藏动画 enter: Transition { NumberAnimation { property: opacity; from: 0.0; to: 1.0; duration: 150 } NumberAnimation { property: y; from: keyboardPopup.parent.height; to: keyboardPopup.parent.height - keyboardPopup.height; duration: 200; easing.type: Easing.OutCubic } } exit: Transition { NumberAnimation { property: opacity; from: 1.0; to: 0.0; duration: 150 } } }关键点解析Popup 使用Popup控件作为容器可以方便地实现弹出效果并管理模态与非模态行为。亚克力背景 通过半透明色 (Qt.rgba) 结合BackdropBlur背景模糊效果模拟Win11的亚克力材质。注意模糊效果可能在不同平台/版本上有差异。布局 使用ColumnLayout和RowLayout进行灵活、自适应的网格布局确保键盘在不同尺寸下都能保持比例。动画enter和exit过渡定义了键盘弹出和隐藏时的动画提升了用户体验。4.2 可复用的按键组件 (KeyButton.qml)这是每个键盘按键的自定义QML组件是项目的核心之一。// File: virtual_keyboard/KeyButton.qml import QtQuick 2.15 import QtQuick.Controls 2.15 Button { id: keyButton property string keyText: // 按键主字符 property string shiftText: // Shift状态下的字符 property string altGrText: // AltGr状态下的字符 property bool isModifier: false // 是否是修饰键 (如Shift, Ctrl) property bool isSpecial: false // 是否是特殊功能键 (如Enter, Backspace) property string displayText: keyText // 实际显示的文字 // 根据键盘状态更新显示文本 function updateDisplayText() { if (keyboardLogic.capsLock !isModifier !isSpecial) { displayText keyboardLogic.shiftPressed ? keyText.toLowerCase() : keyText.toUpperCase(); } else { displayText keyboardLogic.shiftPressed ? (shiftText || keyText.toUpperCase()) : keyText; } // 这里可以加入更多逻辑如AltGr状态 } // 按键视觉反馈 background: Rectangle { id: bg color: keyButton.down ? Qt.darker(#e5e5e5, 1.2) : #e5e5e5 radius: 4 border.width: 1 border.color: keyButton.down ? #0078d4 : #cccccc // 内阴影效果增强立体感 layer.enabled: true layer.effect: DropShadow { verticalOffset: 1 horizontalOffset: 1 color: #40000000 radius: 2 samples: 4 } } contentItem: Text { text: keyButton.displayText font.pixelSize: 16 font.bold: keyButton.isModifier horizontalAlignment: Text.AlignHCenter verticalAlignment: Text.AlignVCenter color: keyButton.down ? #0078d4 : #000000 } // 点击事件处理 onClicked: { if (keyButton.isSpecial) { handleSpecialKey(keyButton.keyText); } else { // 向系统输入法提交字符 Qt.inputMethod.commit(keyButton.displayText); } // 点击后如果Shift不是锁定状态则恢复 if (keyButton.keyText Shift !keyboardLogic.capsLock) { keyboardLogic.shiftPressed false; } } // 连接到键盘逻辑对象监听状态变化 Connections { target: keyboardLogic function onShiftPressedChanged() { updateDisplayText(); } function onCapsLockChanged() { updateDisplayText(); } } Component.onCompleted: { updateDisplayText(); } }关键点解析自定义属性 使用property关键字定义了一系列属性使得该组件高度可配置。这是创建可复用QML组件的关键。状态驱动UIupdateDisplayText函数根据keyboardLogic中的全局状态shiftPressed,capsLock动态计算并更新按键显示的文字。这是实现键盘布局切换的核心。视觉反馈 在background中根据keyButton.down属性改变颜色和边框模拟按键被按下的物理效果。DropShadow效果增加了按键的立体感。事件处理onClicked信号处理器是按键的逻辑核心。对于普通字符键它调用Qt.inputMethod.commit()将字符提交给系统输入法这是QML中与系统输入框交互的标准方式。对于特殊键则调用自定义的处理函数。数据绑定与监听Connections对象用于监听全局键盘逻辑对象的状态变化。一旦shiftPressed或capsLock改变立即更新所有按键的显示。这体现了QML响应式编程的威力。4.3 键盘逻辑控制器 (KeyboardLogic.js / KeyboardLogic.qml)这是一个管理键盘全局状态如Shift、CapsLock、当前语言的JavaScript文件或QML对象。// File: virtual_keyboard/KeyboardLogic.js // 这是一个被QML导入的JS模块 .pragma library // 声明为库避免重复执行 var shiftPressed false; var capsLock false; var currentLanguage en_US; function toggleShift() { shiftPressed !shiftPressed; // 通知所有监听者状态已改变 // 在实际项目中这里可能会触发一个信号 } function toggleCapsLock() { capsLock !capsLock; } function handleSpecialKey(key) { switch(key) { case ←: // Backspace Qt.inputMethod.invokeAction(Qt.ImPlatformData, 1); // 具体action id需查阅文档 // 更通用的方法是发送退格键事件 sendKeyEvent(Qt.Key_Backspace); break; case Enter: sendKeyEvent(Qt.Key_Return); break; case Tab: sendKeyEvent(Qt.Key_Tab); break; // ... 处理其他特殊键 } } // 辅助函数模拟发送键盘事件 (需要C后端支持或更复杂的Qt方法) function sendKeyEvent(key) { console.log(模拟按键:, key); // 这里通常需要调用C后端函数 // backend.sendKeyEvent(key); }在QML中你可以这样使用它// 在某个根QML文件中 import KeyboardLogic.js as Logic Item { id: root property bool shiftPressed: Logic.shiftPressed property bool capsLock: Logic.capsLock // 将逻辑函数暴露给QML function toggleShift() { Logic.toggleShift(); shiftPressed Logic.shiftPressed; } function toggleCapsLock() { Logic.toggleCapsLock(); capsLock Logic.capsLock; } }关键点解析状态集中管理 所有按键共享的状态Shift, CapsLock在这里集中管理避免状态分散和不同步。与系统交互handleSpecialKey函数处理回车、退格等功能键。Qt.inputMethod接口可以处理一些基本操作但对于复杂的键盘模拟可能需要更底层的QKeyEvent发送这通常需要C后端支持。前后端分离 纯JS/QML前端负责UI和基本逻辑复杂的系统级输入模拟交给C后端这是一个清晰的架构。5. 如何集成到你的Qt应用中假设你有一个现有的Qt Quick应用并希望将这个键盘作为组件集成进去。5.1 作为内部组件集成复制文件 将virtual_keyboard整个目录复制到你的Qt项目源码目录中。修改资源文件 (qrc) 在你的项目的.qrc文件中添加这些QML文件确保它们能被正确加载。qresource prefix/ filemain.qml/file !-- 添加键盘文件 -- filevirtual_keyboard/MainKeyboard.qml/file filevirtual_keyboard/KeyButton.qml/file filevirtual_keyboard/KeyboardLogic.js/file !-- ... 其他文件 -- /qresource在主QML中调用 在你需要弹出键盘的地方例如一个文本框获得焦点时实例化MainKeyboard。// 你的主界面 Main.qml import QtQuick 2.15 import QtQuick.Controls 2.15 ApplicationWindow { width: 800 height: 600 visible: true TextField { id: myTextField anchors.centerIn: parent width: 300 placeholderText: 点击输入... onFocusChanged: { if (focus) { virtualKeyboard.open(); } else { virtualKeyboard.close(); } } } // 实例化键盘组件 MainKeyboard { id: virtualKeyboard // 将键盘锚定在底部 y: parent.height - height x: (parent.width - width) / 2 parent: Overlay.overlay // 使用Overlay层确保在最上层 } }5.2 作为独立进程调用你也可以将键盘打包成一个独立的可执行文件然后通过进程间通信IPC从你的主应用中调用它。这种方法更解耦但复杂度更高。可以使用Qt的QProcess类来启动外部键盘程序。6. 构建、运行与效果验证6.1 构建项目在Qt Creator中确保选择了正确的构建套件Kit然后点击“构建”按钮锤子图标。构建成功后你会在输出目录看到可执行文件。6.2 运行与测试点击“运行”按钮。程序启动后点击文本框使其获得焦点键盘应自动从底部滑入。尝试点击字母键观察字符是否能正确输入到文本框中。点击Shift键观察字母区按键的显示是否变为大写或符号。点击CapsLock键观察大小写锁定状态是否切换并且按键显示是否相应更新。测试Backspace、Enter、Space等特殊键的功能。预期效果键盘具有Win11风格的半透明毛玻璃背景。按键有细腻的按下状态视觉反馈。布局切换Shift/CapsLock流畅无卡顿。字符能正确输入到系统的任何输入框包括Qt应用和非Qt应用——这取决于输出层的实现深度。6.3 验证输入是否成功最简单的验证方式是观察目标文本框的内容变化。对于更底层的验证你可以在KeyButton的onClicked处理函数中添加日志输出onClicked: { console.log(Key clicked:, displayText, Committing to input method.); Qt.inputMethod.commit(keyButton.displayText); }在Qt Creator的“应用程序输出”面板中查看日志。7. 常见问题与排查思路在开发和使用过程中你可能会遇到以下问题问题现象可能原因排查方式解决方案键盘无法弹出1.MainKeyboard的parent设置不正确。2.open()方法未被调用。3. 键盘组件未正确导入或加载。1. 检查控制台是否有QML错误。2. 在onFocusChanged中打印日志确认函数被触发。3. 检查.qrc文件是否包含键盘QML文件。1. 确保键盘的parent设置为Overlay.overlay或一个有效的父项。2. 确认调用virtualKeyboard.open()。3. 检查文件路径和导入语句。按键点击无反应1.Qt.inputMethod.commit未生效。2. 目标输入框未获得焦点。3. 按键的onClicked信号未连接。1. 在onClicked中添加console.log确认函数执行。2. 检查系统输入法状态。3. 使用简单的Text { text: Test }替换按钮内容测试点击区域。1. 对于非Qt控件可能需要更底层的键盘事件模拟C后端。2. 确保在输入框获得焦点时才弹出键盘。3. 检查KeyButton组件中onClicked处理器的代码。Shift/CapsLock状态不更新1.KeyboardLogic中的状态变量改变后未通知QML属性。2.Connections对象未正确连接到信号源。1. 在toggleShift函数中打印状态值。2. 检查KeyButton中Connections的target是否正确指向状态管理对象。1. 确保状态变量是QML属性使用property声明或者通过信号-槽机制通知变化。2. 使用alias或全局对象来共享状态。键盘UI错乱或显示不全1. 键盘的固定宽高与窗口大小不匹配。2.Layout属性使用不当。3. 在高DPI屏幕上缩放异常。1. 检查MainKeyboard的width和height是否写死。2. 使用Layout.preferredWidth/Height而非固定值。3. 在Qt Creator的设计模式下预览。1. 使用相对尺寸或基于父窗口计算尺寸。2. 确保RowLayout和ColumnLayout正确嵌套并设置Layout.fillWidth: true。3. 启用高DPI支持QGuiApplication::setAttribute(Qt::AA_EnableHighDpiScaling);。背景模糊效果不生效1.BackdropBlur在旧版Qt或某些平台上不支持。2. 层layer.enabled效果被禁用。1. 查看Qt官方文档确认BackdropBlur的版本要求。2. 尝试一个简单的Rectangle背景看是否显示。1. 降级方案使用半透明纯色或渐变背景。2. 检查图形后端如ANGLE, Software某些后端可能不支持高级特效。在非Qt应用中无法输入Qt.inputMethod.commit()仅对当前Qt应用的焦点控件有效。验证在记事本等系统原生应用中键盘是否有效。需要实现系统级的键盘事件注入。这通常需要平台相关的C代码如Windows的SendInputAPILinux的XTest。这超出了纯QML的范围需要扩展C模块。8. 最佳实践与工程化建议如果你想将这个项目用于生产环境或进行深度定制请考虑以下建议模块化与组件化将键盘布局如英文、数字、符号定义为独立的QML文件或JS数据模型。创建KeyboardLayoutManager来动态加载和切换不同布局支持多语言键盘。性能优化预编译QML 将QML文件编译为二进制资源使用qtquickcompiler可以显著提升加载速度和运行时性能。根据社区经验预编译后加载速度提升可达30%-50%具体取决于项目复杂度。避免过度绘制 复杂的阴影和模糊效果很耗性能。在低端设备上考虑提供“性能模式”开关禁用部分特效。使用Loader延迟加载 如果键盘不是立即需要可以用Loader组件在需要时才加载减少应用启动时间。输入法深度集成C后端 创建Qt C插件封装平台相关的键盘事件发送函数如Windows的keybd_event或SendInput。通过Qt的Q_PROPERTY和Q_INVOKABLE将接口暴露给QML。输入上下文 使用Qt的QInputMethod类来更好地与系统输入上下文交互处理更复杂的输入场景如组合键、死键。可访问性为按键添加Accessible.name和Accessible.description属性支持屏幕阅读器。确保键盘可以通过Tab键导航并具有清晰的视觉焦点指示。样式主题化不要将颜色、尺寸等硬编码在QML文件中。使用Qt Quick Controls 2的样式系统或创建自己的主题属性文件如Theme.qml或palette.js方便切换深色/浅色模式。错误处理与日志在关键的JS函数和事件处理器中添加try-catch。使用console.log、console.warn进行分级日志输出便于调试。版本控制与开源协议明确项目的开源协议如MIT, GPL。在README.md和源码头部清晰注明。维护清晰的CHANGELOG.md记录每个版本的变更。这个开源项目为QML开发者和需要虚拟键盘的应用程序提供了一个高质量的起点。它不仅实现了功能更展示了如何使用QML构建复杂、动态且美观的用户界面。你可以直接使用它也可以将其作为学习QML高级特性的范本根据自身需求进行裁剪和增强。建议将项目克隆到本地运行起来并尝试修改一些样式或逻辑这是掌握其精髓的最佳方式。
RELATED

相关推荐

AI视频超分辨率实战:从原理到4K动漫修复完整指南

AI视频超分辨率实战:从原理到4K动漫修复完整指南

如果你是一位动漫爱好者,或者对AI图像处理技术感兴趣,最近可能被一些“4K修复”、“AI超分”的动漫片段刷屏了。这些视频将我们童年记忆里那些模糊、充满噪点的画面,变得前所未有的清晰和锐利,仿佛时光倒流,让经典作品…

📅 2026/10/27 18:25:33
从223节点Agent图到单体LLM:AI应用架构的简化之道

从223节点Agent图到单体LLM:AI应用架构的简化之道

上周在社区里看到一个讨论,有人问:“现在搞个AI应用,是不是非得搭一套复杂的Agent工作流,弄几十上百个节点,才能做出点像样的东西?” 这个问题背后,其实反映了一个普遍存在的误解:很…

📅 2026/10/18 1:47:33
2026软件测试趋势:自动化与AI测试面试全攻略

2026软件测试趋势:自动化与AI测试面试全攻略

1. 软件测试面试题概述与行业背景2026年的软件测试行业已经呈现出明显的技术融合趋势。根据最新的行业调研报告显示,自动化测试覆盖率从2021年的35%提升至2026年的72%,AI辅助测试工具的市场渗透率达到58%。这种技术演进直接反映在企业招聘的考核标准上—…

📅 2026/10/19 5:40:01
MORE NEWS

更多资讯

📰

非线性光学仿真核心:相位匹配与RK4求解从倍频到OPO/OPA

简介:面向非线性光学仿真与数值计算的完整工程资料包,适合光学工程、物理及相关专业的学生与研究人员,侧重二次谐波产生、参量下转换、四波混频等典型非线性效应,覆盖光场传播、相位匹配、材料极化率与转换效率计算等核心问题。压…

📰

inSSIDer 2.0无线勘测实战:信道规划、干扰排查与数据复核

简介:inSSIDer 2.0 是一款面向 Windows 平台的免费 Wi-Fi 分析工具,适合家庭用户、网络运维初学者及小型办公场景中需要排查无线问题的使用者。它能实时监测周边无线网络的信号强度,分析各频段频道拥挤程度并给出换道建议,识别开放…

📰

Perona-Malik扩散模型Matlab修改版:保边去噪算法与实现

简介:Perona-Malik 扩散模型的修改版 Matlab 代码,面向图像处理、计算机视觉方向的大学生与科研人员,适用于课程设计、期末大作业和毕业设计中的去噪与边缘保持实验。代码基于偏微分方程热扩散思想,在原始模型上调整了扩散函数与迭…

📰

MATLAB调Q光纤激光器仿真:刚性方程建模与数值求解实战

简介:本资源是一套面向本科及硕士阶段科研学习者的调Q光纤激光器Matlab仿真教学包,聚焦光学与激光物理建模,适用于光电信息、激光技术、非线性光学等方向的课程设计、课题入门与算法验证。压缩包共8个文件,含5张关键仿真结果图&am…

📰

Python爬取搜狗微信搜索:公众号数据采集与反爬实战指南

简介:面向微信公众号数据采集入门者与爬虫开发者,这套资源围绕搜狗微信接口实现公众号基础信息与历史文章抓取,覆盖接口调用、参数处理、返回解析与异常规避等关键环节,可帮助读者快速搭建一个轻量级采集原型。包内共三个文件&…

📰

副队长JavaScript教程(49)-主动抛出异常与错误类型

点此查看 所有教程、项目、源码导航 文章目录1. 背景2. throw 抛出异常2.1 throw 的作用2.2 基础示例2.3 什么时候需要 throw3. JS 内置错误类型3.1 Error3.2 ReferenceError 引用错误3.3 TypeError 类型错误3.4 RangeError 范围错误4. 异常处理常见坑4.1 不要无脑捕获所有异常…

TODAY

今日更新

THIS WEEK

本周精选

THIS MONTH

本月热门

读完文章,想聊聊您的网站?

告诉我们您的行业与需求,资深顾问一对一梳理方案与报价,全程免费。

📞 💬