Qt源码分析--QAction

article/2025/10/11 0:39:10

定义:

在应用程序中,可以通过菜单、工具栏按钮和键盘快捷键调用许多常用命令。 由于用户希望每个命令都以相同的方式执行,而不管使用的用户界面如何,将每个命令表示为一个动作(QAction)是很有用的。

调用QAction的官方例子:

    const QIcon openIcon = QIcon::fromTheme("document-open", QIcon(":/images/open.png"));QAction *openAct = new QAction(openIcon, tr("&Open..."), this);openAct->setShortcuts(QKeySequence::Open);openAct->setStatusTip(tr("Open an existing file"));connect(openAct, &QAction::triggered, this, &MainWindow::open);fileMenu->addAction(openAct);fileToolBar->addAction(openAct);

可以看到,QAction把用户的动作通过triggered信号绑定到指定的函数上。

接下来,分析一下QAction::triggered调用流程。

QAction继承于QObject。

当一个事件发生时,Qt 通过构造一个合适的 QEvent 子类的实例来创建一个事件对象来表示它,并通过调用它的 event() 函数将它传递给 QObject 的一个特定实例(或其子类之一)。(参考The Event System | Qt Core 5.15.8)

我们看下QAction的event实现

QAction::event(QEvent *e)
{
#if QT_CONFIG(shortcut)if (e->type() == QEvent::Shortcut) {QShortcutEvent *se = static_cast<QShortcutEvent *>(e);Q_ASSERT_X(se->key() == d_func()->shortcut || d_func()->alternateShortcuts.contains(se->key()),"QAction::event","Received shortcut event from incorrect shortcut");if (se->isAmbiguous())qWarning("QAction::event: Ambiguous shortcut overload: %s", se->key().toString(QKeySequence::NativeText).toLatin1().constData());elseactivate(Trigger);return true;}
#endifreturn QObject::event(e);
}

调用了activate函数

void QAction::activate(ActionEvent event)
{Q_D(QAction);if(event == Trigger) {QPointer<QObject> guard = this;if(d->checkable) {// the checked action of an exclusive group may not be uncheckedif (d->checked && (d->group&& d->group->exclusionPolicy() == QActionGroup::ExclusionPolicy::Exclusive&& d->group->checkedAction() == this)) {if (!guard.isNull())emit triggered(true);return;}setChecked(!d->checked);}if (!guard.isNull())emit triggered(d->checked);} else if(event == Hover) {emit hovered();}
}

触发triggered信号,之后会调用用户绑定的函数。

流程图如下:

 


http://chatgpt.dhexx.cn/article/QFpsAjvE.shtml

相关文章

皮肤切换QAction的使用

/* 显示菜单 */ QMenu * menu ui->menuButton->getmenu(); //把几种皮肤加进来 //前面加图片后面加文字 b1 new QAction(QIcon(":/images/menu.png"), tr("&星球皮肤"), this); b2 new QAction(QIcon(":/images/menu.png"), tr(&qu…

Qt creator中操作QAction加入QToolBar

背景&#xff1a; 个人笔记。 我之前没有系统化学习过任何资料&#xff0c;使用很多工具都是按需出发&#xff0c;直接上手&#xff0c;遇到问题再研究的。所以会有一些弯路。本文言语中难免有对个人情绪的生动描述&#xff0c;希望不要影响读者心情&#xff0c;这只是我学习过…

Qt学习:QAction系列详解

一、QAction类详解 【详细描述】 QAction类提供了抽象的用户界面action&#xff0c;这些action可以被放置在窗口部件中。 应用程序可以通过菜单&#xff0c;工具栏按钮以及键盘快捷键来调用通用的命令。由于用户期望每个命令都能以相同的方式执行&#xff0c;而不管命令所使用的…

QAction、QWidgetAction、QActionGroup

QAction 一、描述 在应用程序中&#xff0c;可以通过菜单、工具栏按钮和键盘快捷键调用许多常用命令。由于用户希望每个命令都以相同的方式执行&#xff0c;因此无论使用何种用户界面&#xff0c;将每个命令表示为一个动作是很有用的。 二、类型成员 1、enum QAction::Acti…

QAction类详解

QAction类提供了抽象的用户界面action&#xff0c;这些action可以被放置在窗口部件中。 应用程序可以通过菜单&#xff0c;工具栏按钮以及键盘快捷键来调用通用的命令。由于用户期望每个命令都能以相同的方式执行&#xff0c;而不管命令所使用的用户界面&#xff0c; 这…

Qt 动作(QAction)

Qt 使用QAction类作为动作,QAction包含了图标、菜单文字、快捷键、状态栏文字、浮动帮助等信息,Qt自己选择使用哪个属性来显示&#xff0c;无需我们关心。同时&#xff0c;Qt 能够保证把QAction对象添加到不同的菜单、工具栏时&#xff0c;显示内容是同步的。也就是说&#xff…

Qt扫盲-QAction理论总结

QAction理论总结 一、概述二、使用 一、概述 在应用程序中&#xff0c;许多常用命令可以通过 菜单、工具栏按钮 和 键盘快捷键 调用。由于用户希望以相同的方式执行每个命令&#xff0c;而不管使用什么用户界面&#xff0c;因此将每个命令表示为一个Action操作是有效的。可以将…

QAction系列详解

【详细描述】 QAction类提供了抽象的用户界面action&#xff0c;这些action可以被放置在窗口部件中。 应用程序可以通过菜单&#xff0c;工具栏按钮以及键盘快捷键来调用通用的命令。由于用户期望每个命令都能以相同的方式执行&#xff0c;而不管命令所使用的用户界面&#xff…

Python爬虫js处理

一、jquery发送ajax请求格式 """ 形式&#xff1a;$.ajax({name:val, name:val,...}); 可选字段&#xff1a; 1&#xff09;url&#xff1a;链接地址&#xff0c;字符串表示 2&#xff09;data&#xff1a;需发送到服务器的数据&#xff0c;GET与POST都可以&am…

爬虫中遇到的js反爬技术

现在的网页代码搞得越来越复杂&#xff0c;除了使用vue等前端框架让开发变得容易外&#xff0c;主要就是为了防爬虫&#xff0c;所以写爬虫下的功夫就越来越多。攻和防在互相厮杀中结下孽缘却又相互提升着彼此。 本文就JS反爬虫的策略展开讨论&#xff0c;看看这中间都有着怎样…

Python爬虫之路-JS的解析

JS的解析 学习目标&#xff1a; 了解 定位js的方法了解 添加断点观察js的执行过程的方法应用 js2py获取js的方法 1 确定js的位置 对于前面人人网的案例&#xff0c;我们知道了url地址中有部分参数&#xff0c;但是参数是如何生成的呢&#xff1f; 毫无疑问&#xff0c;参数肯…

nodejs 爬虫

目标&#xff1a;爬取百度搜索到的女生头像&#xff08;百度图片通用&#xff09; 1. 下载node 可以去官网下载最新版node.js安装程序。&#xff08;地址&#xff1a;node官网&#xff09; 2. 下载需要的依赖&#xff08;模块&#xff09; 这里需要用到superagent模块和nod…

JS逆向爬虫(一)

目录 需要做的事情 一、安装与配置文档 1、node.js安装与配置 2、VSCode安装 3、在VSCode中运行 二、JS常用算法 1、md5 线性散列算法 2、DES/AES对称加密算法 3、RSA 非对称加密算法 4、base64 伪加密算法 三、js逆向案例 1、有道笔记翻译(MD5) 进行js代码调试的流…

爬虫中js的解析

每日分享&#xff1a; 做人要狠 任何关系&#xff0c;合得来就合&#xff0c;合不来就散&#xff0c;没有什么大不了的&#xff0c;理解多了&#xff0c;迁就多了&#xff0c;顾忌多了&#xff0c;痛苦自然就多了&#xff0c;完全没这个必要。别说我狠&#xff0c;以前我比谁…

Node.js爬虫实战:如何快速获取网站数据?

思考&#x1f914; 假设你正在为公司做市场调研&#xff0c;你需要获得一些能够提供关于你的目标受众的信息以进行研究&#xff0c;但是你发现这些信息并不能直接获取。你人工地搜索每个网站是不现实的&#xff0c;所以你需要一种更高效、更自动化、更快速的方式来获取这些信息…

Python爬虫:抓取js生成的数据

之前的NLP课程作业要求爬取一些科技新闻来训练语言模型&#xff0c;本文就简单来说一说用Python来爬取新闻的过程。虽然以前写过简单的爬虫&#xff0c;但是没有处理过浏览器动态加载数据的情况&#xff0c;这次碰到了就记录一下。 这次爬取的新闻来源是 新浪科技滚动新闻&…

js爬虫

互联网 Web 就是一个巨大无比的数据库&#xff0c;但是这个数据库没有一个像 SQL 语言可以直接获取里面的数据&#xff0c;因为更多时候 Web 是供肉眼阅读和操作的。如果要让机器在 Web 取得数据&#xff0c;那往往就是我们所说的“爬虫”了。现在项目需要&#xff0c;所以研究…

爬虫JS逆向思路 --(几千块钱都学不到的思路)

网络上几千块都学不到的JS逆向思路这里全都有&#x1f44f;&#x1f3fb;&#x1f44f;&#x1f3fb;&#x1f44f;&#x1f3fb; 本系列持续更新中&#xff0c;三连关注不迷路&#x1f44c;&#x1f3fb; 干货满满不看后悔&#x1f44d;&#x1f44d;&#x1f44d; &…

手把手操作JS逆向爬虫入门(一)

本文爬取的网站如下&#xff08;可以找解密工具解码&#xff09; aHR0cHM6Ly9uZXdyYW5rLmNuLw 爬取的内容为网站的资讯情报版块的新闻资讯 鼠标点击翻页&#xff0c;在开发者工具中查看请求包&#xff0c;很容看出请求地址和参数&#xff0c; 其中post请求的参数如图&#x…

JS实现图片爬虫

最近在在学node.JS&#xff0c;尝试着跟着网上的教程学着写一个JS爬虫,来爬取网上的图片文件&#xff0c;在此记录过程 获取网站的html结构 首先我们引入node.js的http核心模块&#xff0c;初始化并将目标网站地址作为url参数&#xff0c;接受一个回调函数&#xff0c;在这个…