QWidget/QToolBar::addAction的设计真是绝妙
QWidget/QToolBar::addAction的设计真是绝妙
- 后记
今天在考虑一个Ribbon Page的设计, 想通过一个类直接生成按钮或者菜单, 想到QToolBar
不就可以这样吗? 于是去看一下它怎么做的.
本来是个简单的new QToolButton, 然后添加到 QLayout中, 一看之下, 觉得自己头脑太简单.
原来QToolBar::addAction调用了QWidget::addAction(protected) 方法, 高潮的地方在这里…
QWidget::addAction()并没有直接去创建按钮, 而是发出了一个自定义事件 QActionEvent, 然后让QApplication将这个事件发送给自己!:
void QWidget::insertAction(QAction *before, QAction *action)
{// 这里略去了一段代码, 我们只看关键的QActionEvent e(QEvent::ActionAdded, action, before);QApplication::sendEvent(this, &e);
}
而QWidget里边处理事件的时候, 简单调用了自身的一个虚函数 QWidget::actionEvent
virtual void actionEvent(QActionEvent *event);
意思QWidget只负责处理, 解析事件和派发事件, 而QToolBar实现事件的处理, 去QToolBar::actionEvent()
中去看看, 果然如此(把控件加入到QToolBar的layout中):
void QToolBar::actionEvent(QActionEvent *event)
{Q_D(QToolBar);QAction *action = event->action();QWidgetAction *widgetAction = qobject_cast<QWidgetAction *>(action);switch (event->type()) {case QEvent::ActionAdded: {if (widgetAction != 0 && widgetAction->d_func()->autoCreated)widgetAction->setParent(this);int index = d->layout->count();if (event->before()) {index = d->layout->indexOf(event->before());}d->layout->insertAction(index, action);break;}}default:Q_ASSERT_X(false, "QToolBar::actionEvent", "internal error");}
}
到这里基本可以清晰了, QWidget决定要不要做, 而由具体的子类来决定QAction怎么呈现…牛爆了的设计!
但是这里有点遗憾的是, 没看到QToolButton到底在哪里创建的, 谁能指点一下?
后记
受到回复的启发,去看了一下qtoolbarlayout.cpp
中的源代码,果然是new 了一个QToolButton对象
QToolBarItem *QToolBarLayout::createItem(QAction *action)
{/// ....省略一些代码if (!widget) {QToolButton *button = new QToolButton(tb);button->setAutoRaise(true);button->setFocusPolicy(Qt::NoFocus);button->setIconSize(tb->iconSize());button->setToolButtonStyle(tb->toolButtonStyle());QObject::connect(tb, SIGNAL(iconSizeChanged(QSize)),button, SLOT(setIconSize(QSize)));QObject::connect(tb, SIGNAL(toolButtonStyleChanged(Qt::ToolButtonStyle)),button, SLOT(setToolButtonStyle(Qt::ToolButtonStyle)));button->setDefaultAction(action);QObject::connect(button, SIGNAL(triggered(QAction*)), tb, SIGNAL(actionTriggered(QAction*)));widget = button;standardButtonWidget = true;}}
QWidget/QToolBar::addAction的设计真是绝妙相关推荐
- 用PyQt实现简单的图片浏览器
一,目标 实现简单的图片浏览器,有一个打开按钮,点击该按钮弹出选择窗口,在电脑磁盘中选择图片文件并打开 二,组件架构 QMainWindow |----QScrollArea (CentralWid ...
- 华为swot分析2020_2020华为音频产品汇总分析,完善产品质量,丰富产品线
随着科技的发展,人们的生活方式被不断改善.20世纪以来,智能手机和互联网突飞猛进的发展,极大地便利了人们出行.娱乐.交流沟通等多方面的生活.相应的,智能手机配件产品也在不断进步革新,以满足和适应人们的 ...
- Qt之QToolButton
简述 QToolButton类提供了用于命令或选项可以快速访问的按钮,通常可以用在QToolBar里面. 工具按钮和普通的命令按钮不同,通常不显示文本,而显示图标. 简述 详细描述 常用接口 更多参考 ...
- 继iptables之后的新一代包过滤框架是nftables
夜已深然未央,准备接着讲述有关Netfilter的故事,行文有点松散,由于未打草稿,有点随意识而流,一气呵成不知是自夸还是自嘲,权当小时候写的日 记吧,自幼喜欢每天写日记,中学时更是以退士为名折腾了几 ...
- qt UI design tips
当一个控件不能居中时, 尝试将其放入qwidget中去居中 设计页面时, 先建立一个qFrame, 然后将所有控件放入qFrame中, 这样方便以后调整尺寸 设计页面中的控件时, 尽量尺寸往小的方向设 ...
- Qt控件总结:QToolButton
前言 QToolButton类提供了用于命令或选项可以快速访问的按钮,通常可以用在QToolBar里面. 工具按钮和普通的命令按钮不同,通常不显示文本,而显示图标. 详细描述 当使用QToolBar: ...
- Qt开发自学13_黑白棋
20200603黑白棋 我们的实现目标如下图所示:(不是五子棋) 步骤:1画背景:2画线(横纵各9根):3画棋子(8*8=64个) 掌握:绘图技巧.封装思想 New Project:创建棋盘类Ches ...
- 蒂姆·库克:乔布斯背后的天才
要不是史蒂夫·乔布斯2008年6月现身公司在旧金山举办的活动中消瘦苍白得可怕,人们或许也不会关注这个最有可能接任乔布斯在苹果公司首席执行官职务的家伙---蒂姆·库克.自乔布斯辞去CEO职位,他再次迅速 ...
- Okio精简高效的IO库
2019独角兽企业重金招聘Python工程师标准>>> 本节主要讲讲Okhttp底层使用的IO库--Okio,Okio同样是Square公司推出的增强型IO处理库,旨在增强原生Jav ...
最新文章
- leetcode-92 反转链表II
- dede采集 标题不完整
- muduo之LogFile
- spring3: 4.4 使用路径通配符加载Resource
- Spark集群完全分布式安装部署
- Python数据结构与算法(二)--timeit模块
- linux下下安装jdk-6u45-linux-x64.bin
- php按城市显示搜索结果,在php错误中突出显示搜索结果
- Web后端学习笔记 Flask(9)cookie and session
- spring boot框架学习2-spring boot核心(1)
- python爬取凤凰新闻_python爬虫凤凰网新闻
- hublider配置php环境(wamp、phpstudy,php工具箱...)
- win10系统打不开qq提示错误代码0x00000005怎么办
- 最原始的yuv图像叠加文字的实现--手动操作像素
- IPv6子网数量计算器
- 日中中日翻译必携 实战 5册套装 日文原版_推荐
- 二十三、正则表达式中的“r”含义
- win 10卸载mysql_Windows 10系统下彻底删除卸载MySQL的方法教程
- adb remount失败的解决办法:
- 蓝牙控制esp-32单片机(四)