ARTICLE DETAIL

资讯详情

深耕网站视觉设计与运营推广的一线实战洞察。

NodeGui QComboBox 信号接口 QComboBoxSignals 完全指南:从 TypeScript 类型定义到底层 C++ 信号连接

NodeGui QComboBox 信号接口 QComboBoxSignals 完全指南:从 TypeScript 类型定义到底层 C++ 信号连接 桌面应用跨平台【免费下载链接】nodeguiA library for building cross-platform native desktop applications with Node.js and CSS . React NodeGui : https://react.nodegui.org and Vue NodeGui: https://vue.nodegui.org项目地址https://gitcode.com/gh_mirrors/no/nodegui点击查看免费下载本文以 NodeGui 官方 API 文档中的QComboBoxSignals接口qcomboboxsignals.md为核心完整梳理 QComboBox 下拉选择框在 NodeGui 中可监听的全部 11 个信号7 个 QComboBox 自身信号与 4 个从父类继承的信号。读完本文你将掌握每个信号的触发时机、参数签名与类型学会用addEventListener正确监听下拉框的选中、文本编辑与高亮行为并理解这些 JS 事件是如何通过 ncombobox.hpp 中的 C 信号连接最终触达 Node.js 事件发射器的完整链路。QComboBoxSignals 是什么在 NodeGui 中QComboBox对应 Qt 原生QComboBox提供可下拉选择的一组选项是一个典型的可交互控件。为了让 JS 侧能够响应下拉框的状态变化NodeGui 为每个控件定义了对应的 Signals 接口QComboBoxSignals就是 src/lib/QtWidgets/QComboBox.ts 中定义的泛型参数export interface QComboBoxSignals extends QWidgetSignals { activated: (index: number) void; currentIndexChanged: (index: number) void; currentTextChanged: (text: string) void; editTextChanged: (text: string) void; highlighted: (index: number) void; textActivated: (text: string) void; textHighlighted: (text: string) void; }该接口的类型约束直接作用于QComboBox的泛型声明class QComboBox extends QWidgetQComboBoxSignals进而决定了addEventListener第一个参数SignalType必须是keyof QComboBoxSignals中的合法信号名第二个参数必须是与该信号签名匹配的回调函数——在编译期就杜绝了监听了不存在的信号或回调参数类型不匹配的错误。信号继承层级一份不断扩展的信号族谱QComboBoxSignals并不是凭空定义的它通过接口继承复用了上游控件的信号。完整层级如下QObjectSignals ↳ QWidgetSignals ↳ QComboBoxSignalsqobjectsignals.md 定义了最底层的objectNameChangedqwidgetsignals.md 在QObjectSignals之上扩展了customContextMenuRequested、windowIconChanged、windowTitleChangedQComboBoxSignals再追加 7 个下拉框专属信号。因此QComboBoxSignals的完整信号清单为 11 个activated、currentIndexChanged、currentTextChanged、editTextChanged、highlighted、textActivated、textHighlighted加上继承来的customContextMenuRequested、objectNameChanged、windowIconChanged、windowTitleChanged。这一分层设计与 Qt 自身的信号继承体系一一对应——C 侧的NComboBox同样多重继承自QComboBox与NodeWidget见 ncombobox.hpp并用QWIDGET_SIGNALS宏把 QWidget 层的通用信号一并接上。QComboBox 专属信号逐一详解以下 7 个信号由QComboBoxSignals自身声明全部可在官方生成的接口文档中查到精确签名。activated用户选择了某个条目项说明签名(index: number) void触发时机用户通过键盘或鼠标选择了一个条目时发出与 Qt 对应QComboBox::activated参数index是被选中条目的索引从 0 开始。该信号只在用户交互时发出——用setCurrentIndex()编程式切换当前项不会触发它这是它与currentIndexChanged最关键的区别。在 C 侧通过QOverloadint::of(QComboBox::activated)选取 int 重载版本完成连接ncombobox.hpp。currentIndexChanged当前索引变化项说明签名(index: number) void触发时机当前索引发生变化时发出与 Qt 对应QComboBox::currentIndexChanged参数index为新的当前索引。与activated不同无论是用户操作还是程序调用setCurrentIndex(index)该方法在 QComboBox.ts 中通过this.setProperty(currentIndex, index)实现都会触发该信号因此它常用于同步业务状态、联动其他控件。currentTextChanged当前文本变化项说明签名(text: string) void触发时机当前条目文本变化时发出与 Qt 对应QComboBox::currentTextChanged参数text是新的当前文本。currentText的取值取决于当前索引对应的条目当条目文本改变如通过setItemText或当前项切换时都会触发。这是官方示例中与currentIndexChanged搭配使用频率最高的信号。editTextChanged可编辑模式下文本变化项说明签名(text: string) void触发时机下拉框为可编辑模式setEditable(true)时用户编辑了行编辑区文本与 Qt 对应QComboBox::editTextChanged参数text是编辑区当前的完整文本。只有当调用 setEditable 开启编辑能力后该信号才有意义适合做输入即搜索的联想下拉框。注意它反映的是编辑区的原始输入与当前项文本没有必然联系。highlighted用户高亮某个条目项说明签名(index: number) void触发时机用户在弹出列表中高亮悬停/键盘上下移动某个条目时发出与 Qt 对应QComboBox::highlighted参数index是高亮条目的索引。注意高亮不等于选中——用户用方向键在列表中移动、尚未确认选择时即会高频触发该信号常用于实时预览被高亮项的详细信息。textActivated以文本形式感知选中项说明签名(text: string) void触发时机用户选择某个条目时发出与activated同时刻与 Qt 对应QComboBox::textActivated参数text是被选中条目的文本。当回调中更需要文本而非索引时用它替代activated可以省去一次itemText(index)查询。textHighlighted以文本形式感知高亮项说明签名(text: string) void触发时机用户高亮某个条目时发出与highlighted同时刻与 Qt 对应QComboBox::textHighlighted参数text是高亮条目的文本是highlighted的文本版。从父类继承的 4 个信号QComboBoxSignals还继承了以下 4 个信号因此 QComboBox 实例同样可以直接监听它们信号签名来源触发时机customContextMenuRequested(pos: { x: number; y: number }) voidQWidgetSignals控件上请求弹出上下文菜单如右键时pos为请求位置的坐标对象objectNameChanged(objectName: string) voidQObjectSignals控件的objectName属性发生变化时windowIconChanged(iconNative: NativeElement) voidQWidgetSignals所在窗口图标变化时参数为原生图标句柄类型见 globals.md 中的NativeElementwindowTitleChanged(title: string) voidQWidgetSignals所在窗口标题变化时其中customContextMenuRequested的pos是{ x, y }对象而非单个数字这是接口文档中唯一一个结构化参数的信号实现右键自定义菜单时需要特别注意解构取值。实战完整监听 QComboBox 的 7 个专属信号以下是官方文档示例的完整化版本覆盖了全部 QComboBox 专属信号的监听方式创建、填充、监听、展示用法const { QComboBox } require(nodegui/nodegui); const comboBox new QComboBox(); comboBox.addItem(undefined, comboBox item 0); comboBox.addItem(undefined, comboBox item 1); comboBox.addItem(undefined, comboBox item 2); comboBox.addItem(undefined, comboBox item 3); // 用户选择某项索引 comboBox.addEventListener(activated, (index) { console.log(activated: index); }); // 当前索引变化含编程式切换 comboBox.addEventListener(currentIndexChanged, (index) { console.log(currentIndexChanged: index); }); // 当前文本变化 comboBox.addEventListener(currentTextChanged, (text) { console.log(currentTextChanged: text); }); // 可编辑模式下编辑文本 comboBox.addEventListener(editTextChanged, (text) { console.log(editTextChanged: text); }); // 高亮某条目索引 comboBox.addEventListener(highlighted, (index) { console.log(highlighted: index); }); // 选中某条目文本 comboBox.addEventListener(textActivated, (text) { console.log(textActivated: text); }); // 高亮某条目文本 comboBox.addEventListener(textHighlighted, (text) { console.log(textHighlighted: text); }); // 继承信号示例右键自定义菜单 comboBox.addEventListener(customContextMenuRequested, (pos) { console.log(context menu at: pos.x , pos.y); });配套的条目操作 API定义于 QComboBox.ts包括addItem(icon, text, userData)/addItems(texts)追加条目、insertItem/insertItems指定位置插入、removeItem(index)删除、count()统计条目数、currentIndex()/currentText()读取当前状态、setCurrentIndex/setCurrentText编程式切换、setEditable(boolean)开启可编辑模式。addItem的第三个参数userData默认为new QVariant()可用于为每个条目附加业务数据并通过itemData(index)取回对应 C 封装 qcombobox_wrap.cpp 中 icon/text/userData 三参数与 text/userData 两参数两种重载分支。底层原理JS 信号如何连到 C 的 Qt 信号理解QComboBoxSignals各信号为什么会触发需要看清 NodeGui 的信号转发链路。根据官方开发文档 signal_and_event_handling.md 的说明机制如下JS 侧每个控件实例在构造时EventWidgetNodeWidget的父类为其创建一个 Node.js EventEmitter并把 emitter 的emit函数指针下发到 C 侧存入emitOnNode。C 侧NComboBox重写connectSignalsToEventEmitter()方法逐个用QObject::connect把 Qt 信号与转发 lambda 相连。以 ncombobox.hpp 中的实现为例virtual void connectSignalsToEventEmitter() { QWIDGET_SIGNALS // 父类 QWidget 层信号含 4 个继承信号 QObject::connect( this, QOverloadint::of(QComboBox::activated), { Napi::Env env this-emitOnNode.Env(); Napi::HandleScope scope(env); this-emitOnNode.Call({Napi::String::New(env, activated), Napi::Number::From(env, index)}); }); // currentIndexChanged / currentTextChanged / editTextChanged / // highlighted / textActivated / textHighlighted 依次同理…… }触发即转发任何时刻 Qt 发出对应信号用户点击、键盘选择、程序调用setCurrentIndex等lambda 捕获的emitOnNode就会被调用事件名如activated与参数被序列化成 N-API 值推送回 JS 侧最终派发到addEventListener注册的回调。从源码可观察到两个实现细节activated、currentIndexChanged、highlighted在 Qt 中都有int与QString两个重载NodeGui 用QOverloadint::of(...)显式选择了索引版本对应 JS 侧number参数而textActivated、textHighlighted则直连QString版本对应 JS 侧string参数由此在 JS 层形成了索引/文本各一套的信号对。实用建议与常见陷阱区分用户操作与程序赋值需要感知用户真实选择行为用activated/textActivated需要同步状态包括setCurrentIndex引发的变化用currentIndexChanged/currentTextChanged避免重复处理同一事件。可编辑模式才用editTextChanged未调用setEditable(true)时该信号基本不会触发别把它当普通文本变化信号用。highlighted高频触发用户方向键扫过列表会连续触发回调内不要放重逻辑宜做轻量预览或去抖。customContextMenuRequested的参数是对象回调必须写成(pos) pos.x / pos.y不要按单参数数字解构。类型安全在 TypeScript 中addEventListener会依据QComboBoxSignals做完整类型推导写错信号名或回调参数类型会在编译期报错无需在运行时手动校验。参考链接接口定义qcomboboxsignals.md、qwidgetsignals.md、qobjectsignals.mdTS 封装QComboBox.ts信号接口见 L220-L228完整 API 见 qcombobox.mdC 信号连接ncombobox.hppN-API 绑定实现qcombobox_wrap.cpp信号/事件机制总览signal_and_event_handling.md赞分享桌面应用跨平台【免费下载链接】nodeguiA library for building cross-platform native desktop applications with Node.js and CSS . React NodeGui : https://react.nodegui.org and Vue NodeGui: https://vue.nodegui.org项目地址https://gitcode.com/gh_mirrors/no/nodegui点击查看免费下载相关推荐NodeGui 的 QLineEditSignals 信号接口全解析从 TypeScript 类型到 Qt 原生信号桥接NodeGui 的 QLineEditSignals 信号接口全解析从 TypeScript 类型到 Qt 原生信号桥接 导读 QLineEditSignal桌面应用跨平台NodeGui QListWidgetSignals 信号接口全解析从事件监听到 C 底层实现NodeGui QListWidgetSignals 信号接口全解析从事件监听到 C 底层实现 本指南以 NodeGui 官方 API 文档 qlistw桌面应用跨平台NodeGui QButtonGroupSignals 信号接口详解从事件签名到 C 底层实现NodeGui QButtonGroupSignals 信号接口详解从事件签名到 C 底层实现 本文聚焦 NodeGui 中 QButtonGroup 的桌面应用跨平台上一篇突破协议壁垒Apache Pulsar多协议兼容层深度解析与实战指南下一篇逆向工程 Slang 语言文法语法参考文档与 slang-parser.cpp 的逐条核验与修复实录创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表