QAction类详解

article/2025/10/11 0:55:22

 

        QAction类提供了抽象的用户界面action,这些action可以被放置在窗口部件中。
        应用程序可以通过菜单,工具栏按钮以及键盘快捷键来调用通用的命令。由于用户期望每个命令都能以相同的方式执行,而不管命令所使用的用户界面,
这个时候使用action来表示这些命令就显得十分有用。
         Actions可以被添加到菜单和工具栏中,并且可以自动保持在菜单和工具栏中的同步。例如,在一个字处理软件中,如果用户在工具栏中按下了Bold按钮,那么菜单中的Bold选项就会自动被选中。
         Actions可以作为独立的对象被创建,但是我们也可以在构建菜单的时候创建它们;QMenu类包含了非常简便的方法用于创建适合用作菜单项的actions。
       QAction可以包括一个图标,菜单文本,快捷键,状态文本,"What`s This"文本以及一个tooltip。这些内容的绝大部分都可以在构造函数中设置。也可以通过setIcon(),setIconText(),setShortCut(),setStatusTip(),setWhatsThis和SetToolTip()函数分别设置。对于菜单项,我们还可以通过
setFont()单独为它们设置font。
       可以通过QWidget::addAction()或者是QGraphicsWidget::addAction()函数将Actions添加到窗口部件上。注意,只有将Actions添加到窗口部件上之后,我们才可以使用这些actions;当actions的快捷键是全局的时候,我们也必须先将actions添加到窗口部件上。
       一旦QAction被创建了,那么就必须将它添加到相关的菜单和工具栏上,然后将它们链接到实现相应action功能的槽函数上。例如:

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

我们建议将actions作为使用它们的窗口的孩子创建。在绝大多数情况下,actions都是应用程序主窗口的孩子。

类的枚举成员变量:

 这个枚举类型主要是在调用QAction::activate()函数的时候被使用到。我们来看看QAction::activate()函数的原型:

       从上面可以看出,我们使用该函数发射信号,而参数event则指明了发射的信号类型。基于action的widgets可以自己发射信号,然而我们也可以显式的调用本API来发射信号。

         由于Mac OS X系统的一些特性,Qt 会对一些菜单项进行自动排列。比如,如果你的菜单是“关于”、“设置”、“首选项”、“退出”等等,我们可以给它们分配一个角色,Qt 则会根据这些角色对菜单项的顺序作出正确的排列。方法是,设置 QAction::menuRole 属性,例如:AboutRole、PreferencesRole、QuitRole 或者 NoRole。举例来说,我们可以将“设置”菜单项作为 Mac OS X 的 Application::preferences。

         QAction::MenuRole类型的枚举主要描述了在Mac OS X系统上,action如何移动到应用程序的菜单上。设置这个值只对菜单上的直接菜单有效,对子菜单无效。例如:如果有一个File菜单,该File菜单又包含有子菜单,那么如果你针对子菜单设置这些值,那么这些值永远不会起作用。

      该优先级用于表明action在用户界面上的优先级。例如,当你的工具栏设置了Qt::ToolButtonTextBesideIcon模式,那么低优先级的actions将不会显示出标签。

示例

(1) 使用Action构造工具栏和菜单栏

MainWindow::MainWindow(QWidget *parent): QMainWindow(parent)
{initMenu();initToolBar();
}
void MainWindow::initMenu()
{/* 初始化File菜单 */fileMenu = new QMenu(tr("File"), this);fileOpenAction = new QAction("&Open...", this);fileSaveAction = new QAction("&Save...", this);fileMenu->addAction(fileOpenAction);fileMenu->addAction(fileSaveAction);/* 初始化Edit菜单 */editMenu = new QMenu("&Edit");editCopyAction = editMenu->addAction("&Copy");editCutAction = editMenu->addAction("&Cut");/* 将菜单添加到菜单栏上 */QMenuBar *menuBar = this->menuBar();menuBar->addMenu(fileMenu);menuBar->addMenu(editMenu);
}
void MainWindow::initToolBar()
{/* 初始化FileToolBar */fileToolBar = new QToolBar(this);fileToolBar->addAction(fileOpenAction);fileToolBar->addAction(fileSaveAction);/* 初始化EditToolBar */editToolBar = new QToolBar(this);editToolBar->addAction(editCopyAction);editToolBar->addAction(editCutAction);/* 将工具添加到工具栏上 */addToolBar(Qt::TopToolBarArea, fileToolBar);addToolBar(Qt::TopToolBarArea, editToolBar);
}
MainWindow::~MainWindow()
{}

(2)测试QAction::activate(QAction::ActionEvent)

MainWindow::MainWindow(QWidget *parent): QMainWindow(parent)
{initMenu();initToolBar();initConnect();
}
void MainWindow::initConnect()
{connect(fileOpenAction, SIGNAL(triggered()),this, SLOT(sendActivate()));connect(fileSaveAction, SIGNAL(hovered()),this, SLOT(ansHovered()));
}
void MainWindow::sendActivate()
{/* 这将会导致fileSaveAction发送信号QAction::hovered() */fileSaveAction->activate(QAction::Hover);
}
void MainWindow::ansHovered()
{qDebug("Ans!!!");
}

运行结果:

(3)测试QAction::Priority

void MainWindow::initMenu()
{/* 初始化File菜单 */fileMenu = new QMenu(tr("File"), this);fileOpenAction = new QAction("&Open...", this);fileSaveAction = new QAction("&Save...", this);fileMenu->addAction(fileOpenAction);fileMenu->addAction(fileSaveAction);/* 初始化Edit菜单 */editMenu = new QMenu("&Edit");editCopyAction = editMenu->addAction("&Copy");editCutAction = editMenu->addAction(QIcon(":/cut.PNG"), "&Cut");//editCutAction->setPriority(QAction::LowPriority);/* 将菜单添加到菜单栏上 */QMenuBar *menuBar = this->menuBar();menuBar->addMenu(fileMenu);menuBar->addMenu(editMenu);
}
void MainWindow::initToolBar()
{/* 初始化FileToolBar */fileToolBar = new QToolBar(this);fileToolBar->addAction(fileOpenAction);fileToolBar->addAction(fileSaveAction);/* 初始化EditToolBar */editToolBar = new QToolBar(this);editToolBar->addAction(editCopyAction);editToolBar->addAction(editCutAction);/* 将工具添加到工具栏上 */addToolBar(Qt::TopToolBarArea, fileToolBar);addToolBar(Qt::TopToolBarArea, editToolBar);/* 设置工具栏为QT::ToolButtonTextBesideIcon */this->setToolButtonStyle(Qt::ToolButtonTextBesideIcon);
}

此时注释掉了设置优先级的语句,图标和文字均能显示出来,效果如下图:

/* 初始化Edit菜单 */editMenu = new QMenu("&Edit");editCopyAction = editMenu->addAction("&Copy");editCutAction = editMenu->addAction(QIcon(":/cut.PNG"), "&Cut");editCutAction->setPriority(QAction::LowPriority);

运行效果如下:

 

参考:

https://www.yuque.com/docs/share/8c9cd912-4fbc-4656-82b7-9815f9b199d0

 


http://chatgpt.dhexx.cn/article/5IOpK0J6.shtml

相关文章

Qt 动作(QAction)

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

Qt扫盲-QAction理论总结

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

QAction系列详解

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

Python爬虫js处理

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

爬虫中遇到的js反爬技术

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

Python爬虫之路-JS的解析

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

nodejs 爬虫

目标:爬取百度搜索到的女生头像(百度图片通用) 1. 下载node 可以去官网下载最新版node.js安装程序。(地址:node官网) 2. 下载需要的依赖(模块) 这里需要用到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的解析

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

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

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

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

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

js爬虫

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

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

网络上几千块都学不到的JS逆向思路这里全都有👏🏻👏🏻👏🏻 本系列持续更新中,三连关注不迷路👌🏻 干货满满不看后悔👍👍👍 &…

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

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

JS实现图片爬虫

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

从零开始学JS爬虫,轻松抓取网页数据!

随着互联网的发展,网页已经成为人们获取信息的重要途径之一。而如何高效地获取所需信息,就成为了很多人关注的问题。本文将介绍JS爬虫入门,帮助读者从零开始抓取网页数据。 一、概述 在介绍JS爬虫之前,我们先来了解一下爬虫的基…

爬虫之JS的解析

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

JavaScript爬取网页并分析

JavaScript爬取网页并分析 任务分析 爬取三个网站下的新闻数据,这里选择网易新闻网(https://news.163.com/);提取每条新闻的如下字段:标题,内容,发表日期,网址&#xf…

js - 爬虫的实现

爬虫的原理 爬虫,就是一个自动爬取网页上展示的信息的工具。我们要写一款爬虫,就要满足下面的条件: 网络的请求。首先我们要进行网络请求,让目标给我们返回信息(常用的模块有http、http2、https、request、axios、pu…

Node.js实现简单爬虫 讲解

一、什么是爬虫 网络爬虫(又称为网页蜘蛛,网络机器人,在FOAF社区中间,更经常的称为网页追逐者),是一种按照一定规则,自动的抓取万维网信息的程序或者脚本。另外一些不常使用的名字还有蚂蚁、自动索引、模拟程序或者蠕…