QGraphicsScene添加Widget

  • 简要说明
  • 示例介绍
  • 开发环境
  • 示例代码
  • 效果演示

简要说明

使用QGraphicsScene的addWidget(QWidget *widget, Qt::WindowFlags wFlangs)可以在场景中添加任意一个继承自QWidget的对象,可以是QPushButton,也可以是自定义的Widget。
在使用时是为要添加的Widget创建一个新的QGraphicsProxyWidget,并将其加入到场景中,返回一个指向这个QGraphicsProxyWidget的指针。此时可以将QGraphicsProxyWidget看做一个QGraphicsItem,可以setPos、setFlags等。

示例介绍

为更直观的展示QGraphicsScene的addWidget功能,附上一个简单示例。此示例的功能是实现一个自定义的Widget在场景的随鼠标拖拽而移动。

开发环境

Qt5.12.4 + VS2017 (64位)

示例代码

1、自定义ActorWidget

#ifndef ACTORWIDGET_H
#define ACTORWIDGET_H#include <QWidget>class ActorWidget : public QWidget
{Q_OBJECT
public:explicit ActorWidget(QWidget *parent = nullptr);signals:public slots:
};#endif // ACTORWIDGET_H
#include "actorwidget.h"ActorWidget::ActorWidget(QWidget *parent) : QWidget(parent)
{this->setStyleSheet("QWidget{background: lightblue;}");this->setMouseTracking(true);
}

2、自定义GraphicsScene

#ifndef CUSTOMGRAPHICSSCENE_H
#define CUSTOMGRAPHICSSCENE_H#include <QGraphicsScene>class CustomGraphicsScene : public QGraphicsScene
{public:CustomGraphicsScene();protected:void mousePressEvent(QGraphicsSceneMouseEvent *event);void mouseMoveEvent(QGraphicsSceneMouseEvent *event);void mouseReleaseEvent(QGraphicsSceneMouseEvent *event);private:QGraphicsItem *m_pItemSelected; //鼠标选中的QGraphicsItemQPointF m_Offset; //鼠标移动的偏移量QPointF m_Pressed; //鼠标按下的位置点QPointF m_ItemPos; //鼠标选中的QGraphicsItem在场景中的位置bool m_bPressed; //鼠标是否按下
};#endif // CUSTOMGRAPHICSSCENE_H
#include "customgraphicsscene.h"#include <QGraphicsSceneMouseEvent>
#include <QGraphicsItem>
#include <QGraphicsProxyWidget>CustomGraphicsScene::CustomGraphicsScene(): m_bPressed(false)
{}void CustomGraphicsScene::mousePressEvent(QGraphicsSceneMouseEvent *event)
{QGraphicsScene::mousePressEvent(event);if(event->button() == Qt::LeftButton){m_pItemSelected = nullptr;foreach(QGraphicsItem *item, items(event->scenePos()))//循环查找当前鼠标位置点下所有的Item{if(item->type() == QGraphicsProxyWidget::Type)//判断此Item是否为添加的ActorWidget创建的QGraphicsProxyWidget{m_bPressed = true;m_Pressed = event->scenePos(); //记录此时鼠标在场景中位置点m_pItemSelected = item; //选中的ItemQGraphicsProxyWidget *pProxyWidget = qgraphicsitem_cast<QGraphicsProxyWidget*>(item);m_ItemPos = pProxyWidget->scenePos(); //QGraphicsProxyWidget的位置点break;}}}
}void CustomGraphicsScene::mouseMoveEvent(QGraphicsSceneMouseEvent *event)
{QGraphicsScene::mouseMoveEvent(event);if(m_pItemSelected != nullptr){if(m_bPressed){m_Offset = event->scenePos() - m_Pressed; //鼠标移动的偏移量m_pItemSelected->setPos(m_ItemPos + m_Offset); //结合鼠标按下时Item的位置点,重新设置Item的位置点}}
}void CustomGraphicsScene::mouseReleaseEvent(QGraphicsSceneMouseEvent *event)
{QGraphicsScene::mouseReleaseEvent(event);m_bPressed = false;if(m_pItemSelected != nullptr){m_pItemSelected = nullptr; //鼠标释放时将选中的Item设为空}
}

3、主窗口MainWindow

#ifndef MAINWINDOW_H
#define MAINWINDOW_H#include <QMainWindow>
#include <QGraphicsScene>#include "actorwidget.h"
#include "customgraphicsscene.h"namespace Ui {class MainWindow;
}class MainWindow : public QMainWindow
{Q_OBJECTpublic:explicit MainWindow(QWidget *parent = nullptr);~MainWindow();private:void InitUI();private:Ui::MainWindow *ui;private:CustomGraphicsScene *m_pGraphicsScene;ActorWidget *m_pActorWidget;
};#endif // MAINWINDOW_H
#include "mainwindow.h"
#include "ui_mainwindow.h"#include <QGraphicsProxyWidget>MainWindow::MainWindow(QWidget *parent) :QMainWindow(parent),ui(new Ui::MainWindow)
{ui->setupUi(this);InitUI();
}MainWindow::~MainWindow()
{delete ui;
}void MainWindow::InitUI()
{this->resize(540,400);m_pGraphicsScene = new CustomGraphicsScene; //自定义的场景m_pGraphicsScene->setSceneRect(0,0, ui->graphicsView->width(), ui->graphicsView->height()); //设置场景大小,占据整个QGraphicsView窗口ui->graphicsView->setScene(m_pGraphicsScene); //为QGraphicsView设置场景m_pActorWidget = new ActorWidget; //自定义的ActorWidgetm_pActorWidget->resize(400,300);QGraphicsProxyWidget *pWidget = m_pGraphicsScene->addWidget(m_pActorWidget); //在场景中添加自定义的ActorWidget,返回一个QGraphicsProxyWidget指针pWidget->setPos((ui->graphicsView->width()-m_pActorWidget->width())/2,(ui->graphicsView->height()-m_pActorWidget->height())/2);  //通过QGraphicsProxyWidget指针设置其位置,居中显示pWidget->setFlags(QGraphicsItem::ItemIsFocusable | QGraphicsItem::ItemIsSelectable | QGraphicsItem::ItemIsMovable); //通过QGraphicsProxyWidget指针设置其可选、可移动、可聚焦
}

效果演示

QGraphicsScene添加Widget相关推荐

  1. 华为鸿蒙小插件,华为鸿蒙系统细节曝光 可添加Widget插件

    在上周,华为鸿蒙系统被曝在华为Mate 30系列手机上开启测试,并对该操作系统进行改进,不过测试的结果究竟如何呢?直到7月9日,一位不愿透露姓名的内测人员向外媒huaweicentral透露了鸿蒙系统 ...

  2. ArcGIS API for JavaScript 4.2学习笔记[10] 2D添加指北针widget、视图保存、视图padding(第二章完结)...

    这几个例子是第二章除了入门之外比较简单的几个,就做个合集,把最核心的代码(第二参数)和 引用放上来即可,不作多解释. 2D地图添加指北针widget 2D地图一般修正方向为正北方就需要这个widget ...

  3. Android 之窗口小部件详解--App Widget

    1 App Widget简介 App Widget是应用程序窗口小部件(Widget)是微型的应用程序视图,它可以被嵌入到其它应用程序中(比如桌面)并接收周期性的更新.你可以通过一个App Widge ...

  4. 桌面时钟代码_iOS 14 制作自己的桌面 Widget

    在上一篇文章中, 我和大家介绍了 iOS 14 Widget 的基本内容, 了解了组成 Widget 的主要几个组件. 这篇文章开始, 我会和大家一起对 Xcode 自带的默认项目做一些优化, 让大家 ...

  5. Qt 【widget如何铺满窗口】

    刚接触qt不是很长时间,都是使用ui拖拽控件实现界面,然后发现有些问题就是控件一旦多了起来,拖拽就不好控制了,然后就转而使用纯代码开发. 一下是碰到第一个问题: 创建一个MainWidget; Mai ...

  6. Widget开发中遇到的坑

    1.在Manifest文件中声明 <receiver android:name=".receiver.GoldWidgetProvider"><intent-fi ...

  7. ThingsBoard CE添加数据导出excel功能

    此文具体代码在文末语雀链接,需额外付费 b站效果演示地址 https://www.bilibili.com/video/BV1dK4y1P7hX 目录 前言 CE版本实现演示 组件设置页面修改 添加「 ...

  8. 自定义小部件Widget的探讨

    目录 一.前言 二.Widget基本使用 2.1 AppWidgetProvider继承类对象 2.2 AppWidgetProviderInfo资源配置文件 三.定制化需求 3.1 困境 3.2 自 ...

  9. 在PCLVisualizer中添加坐标轴和图片和颜色表

    继承PCL可视化类,实现坐标轴.PNG图片.颜色表的显示 pcl::visualization::PCLVisualizer是pcl中的可视化类,支持点云显示,点云拾取,点云框选等,但是无法添加图片和 ...

最新文章

  1. ExtJs自学教程(1):一切从API開始
  2. mysql 三主_MySQL主主复制3
  3. 高斯金字塔 拉普拉斯金字塔_金字塔学入门指南
  4. C# 判别系统版本以及Win10的识别办法
  5. 怎么使用小爱同学音响_小爱同学语音唤醒功能怎么设置,小爱同学音箱的优缺点是什么...
  6. 有道词典的本地/扩展/离线词库
  7. 图书销售系统可行性分析报告
  8. 小米手机qq邮箱收件服务器,小米手机邮箱设置详细教程(各主流邮箱)
  9. 超级经典的人生格言(搞笑)
  10. ({}+{}).length
  11. E-NCAP增加黑暗场景下AEB测试,红外夜视或成主流配置
  12. Python PySpark 大数据时代
  13. 课堂问题:一个凸函数的性质
  14. Opencv c++从影像分帧开始,制作数据集
  15. bootstrap轮播图代码详解
  16. Delphi最新版电子体温单源码(免控件)
  17. Wi-Fi 安全协议
  18. Java 线程安全的集合
  19. 护卫神 mysql 升级_护卫神php套件 php版本升级方法(php5.5.24)
  20. C#上位机——倒计时计时器

热门文章

  1. 2022-2023山东大学软件学院计算机网络期末试题回忆及复习建议
  2. LaTeX 如何使用双引号,单引号
  3. 管理经济学之颗粒归仓(二)
  4. 实时操作系统的滴答Tick设置多少才合适?
  5. file文件C语言,C语言 File文件处理 创建和写文件
  6. coreseek(sphinx)错误:WARNING: attribute 'id' not found - IGNORING原因及解决方法
  7. 007利用癫痫脑电图数据检测癫痫发作和特征频率的深度卷积神经网络方法-2021
  8. 终端安全管理防护的措施之一
  9. tutorabc怎么学英文?我来说说自己的真实感受ˇ
  10. RIP的简单配置实验