在QGraphicsScene中嵌入QWidget
简述
图形视图对将任何 widget 嵌入到场景中提供了无缝的支持。可以嵌入简单的 widget例如QLineEdit、QPushButton也可以是复杂的 widget例如QTabWidget甚至是完整的主窗口。
要将 widget 嵌入场景中只需要简单地调用 QGraphicsScene::addWidget()或者创建一个 QGraphicsProxyWidget 对象并将 widget 手工地嵌入其中。
- 简述
- QGraphicsProxyWidget
- 使用 QGraphicsProxyWidget 嵌入 Widget
- 同步 Widget 状态
QGraphicsProxyWidget
QGraphicsProxyWidget 类提供了一个代理层用于在 QGraphicsScene 中嵌入一个 QWidget。
QGraphicsProxyWidget 嵌入基于 QWidget 的部件例如QPushButton、QFontComboBox甚至 QFileDialog、QGraphicsScene。它在两个对象之间转发事件并在 QWidget 的基于整数的 geometry 和 QGraphicsWidget 的基于 qreal 的 geometry 之间进行转换。
QGraphicsProxyWidget 支持 QWidget 的所有核心功能包括Tab 焦点、键盘输入、拖放和弹出窗口。还可以嵌入复杂的 widget例如带有子 widget 的 widget。
QGraphicsProxyWidget 通过为每个 popup 创建一个子代理来负责嵌入 widget 的 popup 孩子的自动嵌入。这意味着当嵌入的 QComboBox 显示其弹出列表时会自动创建一个新的 QGraphicsProxyWidget嵌入 popup 并正确定位。这只有当 popup 是嵌入的 widget 的孩子时才有效例如 QToolButton::setMenu() 要求 QMenu 实例是 QToolButton 的孩子。
使用 QGraphicsProxyWidget 嵌入 Widget
使用 QGraphicsProxyWidget 嵌入一个 widget 有两种方法
- 将一个 widget 指针和任何相关的 Qt::WindowFlags 传递给 QGraphicsScene::addWidget() - 最常用的方式。
- 创建一个新的 QGraphicsProxyWidget然后调用 setWidget() 嵌入一个 QWidget。
例如在下面的代码段中我们在代理中嵌入了一个 QGroupBox
QGroupBox *pGroupBox = new QGroupBox();
QLabel *pTellLabel = new QLabel();
QLabel *pAddressLabel = new QLabel();
QLineEdit *pTellLineEdit = new QLineEdit();
QLineEdit *pAddressLineEdit = new QLineEdit();pGroupBox->setTitle(QStringLiteral("联系方式"));
pTellLabel->setText(QStringLiteral("电话号码"));
pAddressLabel->setText(QStringLiteral("居住地址"));
pTellLineEdit->setPlaceholderText(QStringLiteral("手机/固话"));
pAddressLineEdit->setPlaceholderText(QStringLiteral("具体到门牌号"));QFormLayout *pLayout = new QFormLayout;
pLayout->addRow(pTellLabel, pTellLineEdit);
pLayout->addRow(pAddressLabel, pAddressLineEdit);
pLayout->setSpacing(10);
pLayout->setMargin(20);
pGroupBox->setLayout(pLayout);QGraphicsScene scene;
QGraphicsProxyWidget *pProxy = scene.addWidget(pGroupBox);QGraphicsView view(&scene);
view.show();
QGraphicsProxyWidget 与 QWidget 共享所有权因此如果这两个 widget 中的任一个被销毁另一个也将被自动销毁。
同步 Widget 状态
QGraphicsProxyWidget 保持其与嵌入的 widget 状态同步。例如如果代理被隐藏或禁用嵌入的 widget 也将被隐藏或禁用反之亦然。
当 widget 通过调用 addWidget() 被嵌入时QGraphicsProxyWidget 将 widget 的状态例如visible、enabled、geometry、size hints复制到代理中然后两者将尽可能地保持同步。 默认情况下当一个 widget 被嵌入到代理中后widget 和代理都是可见的因为 QGraphicsWidget 在创建时是可见的不必调用 show()。如果显式隐藏嵌入的 widget 代理也将变为不可见。
示例
QGraphicsScene scene;QLineEdit *edit = new QLineEdit;
QGraphicsProxyWidget *proxy = scene.addWidget(edit);edit->isVisible(); // 返回 true
proxy->isVisible(); // 也返回 trueedit->hide();edit->isVisible(); // 返回 false
proxy->isVisible(); // 也返回 false
QGraphicsProxyWidget 保持以下状态的对称性
QWidget 状态 | QGraphicsProxyWidget 状态 | 说明 |
---|---|---|
QWidget::enabled | QGraphicsProxyWidget::enabled | |
QWidget::visible | QGraphicsProxyWidget::visible | 显式状态也是对称的 |
QWidget::geometry | QGraphicsProxyWidget::geometry | 当嵌入的 widget 可见时Geometry 仅保证是对称的 |
QWidget::layoutDirection | QGraphicsProxyWidget::layoutDirection | |
QWidget::style | QGraphicsProxyWidget::style | |
QWidget::palette | QGraphicsProxyWidget::palette | |
QWidget::font | QGraphicsProxyWidget::font | |
QWidget::cursor | QGraphicsProxyWidget::cursor | 嵌入的 widget 覆盖代理光标代理光标的改变依赖嵌入的子 widget 当前在鼠标下。 |
QWidget::sizeHint() | QGraphicsProxyWidget::sizeHint() | 嵌入的 widget 的所有大小提示功能均由代理转发 |
QWidget::getContentsMargins() | QGraphicsProxyWidget::getContentsMargins() | 通过 setWidget() 更新一次 |
QWidget::windowTitle | QGraphicsProxyWidget::windowTitle | 通过 setWidget() 更新一次 |
注意当 widget 被嵌入时QGraphicsScene 保持嵌入的 widget 在一个特殊的状态防止它影响其他 widget嵌入和非嵌入。在此状态下widget 在行为上可能与未嵌入时略有不同。
警告 QGraphicsProxyWidget 类是为了便于桥接 QWidgets 和 QGraphicsItems 而提供不应该用于高性能场景。
在QGraphicsScene中嵌入QWidget相关推荐
- QGraphicsScene中嵌入自定义窗口
在一些特殊的应用中比如平面游戏,地图应用等等当中,我们需要在场景中嵌入一些自定义的窗口.这时候我们就需要研究一下如何在QGraphicsScene中嵌入自己定义的窗口和控件了.其实QT已经提供了对应的 ...
- 转载:QTableView中嵌入可视化组件
出处:http://qimo601.iteye.com/blog/1538364 QTableView中嵌入可视化组件方法有四种: 第一种不能之前显示,必须双击/选中后才能显示,不适用. 第二种比较简 ...
- Matplotlib画图教程:在QT界面中嵌入三维图片
Matplotlib画图教程:在QT界面中嵌入三维图片 需求: 做项目报告的时候,有这么一个想法,就是能通过UI随时调用matplotlib进行二维图和三维图的绘制.因此就诞生了做这么一个小模块的想法 ...
- 【Qt】QTableView中嵌入复选框CheckBox 的四种方法总结
搜索了一下,QTableView中嵌入复选框CheckBox方法有四种: 第一种不能之前显示,必须双击/选中后才能显示,不适用. 第二种比较简单,通常用这种方法. 第三种只适合静态显示静态数据用 第四 ...
- Pyside2中嵌入Matplotlib的绘图
近期遇到一个需求,就是用PySide2做出一个GUI,并且要将后台使用Matplotlib绘制的图显示在界面上.自己琢磨了蛮久,网上也搜了不少资料,但都感觉参差不齐,所以就自己总结一下. 我们使用QG ...
- 【PyQt】Qt中QMainWindow, QWidget以及QDialog的区别和选择
PyQt中MainWindow, QWidget以及Dialog的区别和选择 1. Qt界面分类 在Qt Designer设计界面时,首先需要选择界面模板,主要分为三个类: 1. Main Windo ...
- Qt中嵌入web网页的几种实现方式
1.背景 Web网页的界面交互相比较Qt客户端而言有着比较大的优势:更加的多样化和更高的使用便捷性使得我们即使在客户端中也可以考虑将web网页嵌入到客户端的界面当中.如此便能将web的优势和客户端进行 ...
- python 3d图形控件 可交互_python – 在PySide中嵌入交互式3D绘图
在PySide GUI中嵌入交互式3D绘图的最佳方法是什么?我在这里看了一些关于PySide GUI中嵌入的2D图的例子: 但是,我正在寻找的功能并不完全相同.该图需要根据用户的鼠标输入进行旋转和缩放 ...
- 实验四:使用库函数API和C代码中嵌入汇编代码两种方式使用同一个系统调用
贺邦+原创作品转载请注明出处 + <Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC-1000029000 实验目的: 使用库函数 ...
- 在windows程序中嵌入Lua脚本引擎--编写自己的Lua库
在<在windows程序中嵌入Lua脚本引擎--建立一个简易的"云命令"执行的系统>一文中,我提到了使用Lua的ffi库,可以让我们像写C代码一样写lua程序.这是个非 ...
最新文章
- goland 关闭 自动移除未使用的包 自动添加需要的包
- 浅谈电量传感器在数据中心不间断电源中的应用
- 2019计算机视觉论文精选速递(2019/1/23-2018/1/28)
- 结构体与共用体(联合体)
- Java中short、int、long、float、double的取值范围
- CentOS 7安装docker环境
- android+1m的大小,android raw读取超过1M文件的方法
- 抖音皮皮虾快手无水印解析软件
- java 实现 excel 去重,nodejs读取并去重excel文件
- 浅学 web安全知识(好奇)
- 22岁90后白羊座罗生和勒索病毒的背后故事
- HTML静态页面总体设计思路,网页设计与制作(HTML+CSS+JavaScript)(张洪斌 刘万辉)课程整体设计...
- 卓佳收购CP TRUST Co. Ltd.,借此加强在马来西亚纳闽的业务
- BAT54C做电源保护使用电路及理解
- 微信文件夹的dat文件怎么打开_微信dat文件怎么打开?
- 高德城市最新poi|高德历史poi列表
- Linux中级(六)Proxy服务器
- 计算机上找不到运行程序怎么办,电脑运行程序打不开怎么解决
- 【原创】将数据生成json文件下载以及json中文乱码和优化json文件格式的方法
- 2.天气预报:解释批处理WSDL-SQUARED.CMD生成的主要的类
热门文章
- 177.第N高的薪水
- 常见排序算法整理1(C++实现)
- java php 采集数据,php和java进行交互数据
- ios3怎么取消长按弹出菜单_iOS中长按调出菜单组件UIMenuController的使用实例
- SVM入门(五)线性分类器的求解——问题的描述Part2
- python中小用法之assert,*arg,**arg用法全解
- 【ZOJ 3715 —— 13年浙江省赛K】Kindergarten Election 【枚举答案进行判断】 【夺宝奇兵 —— CCPC-Wannafly Winter Camp Day1】
- pandas DataFrame 根据多列的值做判断,生成新的列值
- 自豪地采用WordPress,如何删除链接?
- Raki的读paper小记:TriggerNER: Learning with Entity Triggers as Explanations for Named Entity Recognition