Basic Graphics Layouts Example 官方示例 笔记

2023-10-17 17:32

本文主要是介绍Basic Graphics Layouts Example 官方示例 笔记,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

参考例子:https://doc.qt.io/qt-5/qtwidgets-graphicsview-basicgraphicslayouts-example.html

QGraphicsItem
用于绘制图形项的类。
如果想绘制自定义的图形项,需要继承该类,并实现它里面的两个虚函数:boundingRect()、paint()。
boundingRect() 用于返回 item 绘制的区域的数据,在paint() 函数里实现该 item 的具体绘制。

QGraphicsLayoutItem Class
该类是一个抽象类,通过继承该类,可以让你自定义的 item 能够被布局管理。
QGraphicsLayoutItem 定义了一组虚函数,描述了QGraphicsLayout排列的任何对象的大小、大小策略和大小提示。

QGraphicsLinearLayout Class
继承于 QGraphicsLayoutItem。
该类在Graphics View中提供水平或垂直的布局来管理Widget。默认是水平。

QGraphicsGridLayout Class
继承于 QGraphicsLayoutItem。
该类在Graphcis View中提供网格布局来管理Widget。

源码:

// window.h
#ifndef WINDOW_H
#define WINDOW_H#include <QGraphicsWidget>//! [0]
class Window : public QGraphicsWidget
{Q_OBJECT
public:Window(QGraphicsWidget *parent = nullptr);};
//! [0]#endif  //WINDOW_H
// window.cpp
#include "window.h"
#include "layoutitem.h"#include <QGraphicsLinearLayout>
#include <QGraphicsGridLayout>Window::Window(QGraphicsWidget *parent) : QGraphicsWidget(parent, Qt::Window)
{
//! [0]QGraphicsLinearLayout *windowLayout = new QGraphicsLinearLayout(Qt::Vertical);QGraphicsLinearLayout *linear = new QGraphicsLinearLayout(windowLayout);LayoutItem *item = new LayoutItem;linear->addItem(item);linear->setStretchFactor(item, 1);
//! [0]//! [1]item = new LayoutItem;linear->addItem(item);linear->setStretchFactor(item, 3);windowLayout->addItem(linear);
//! [1]//! [2]QGraphicsGridLayout *grid = new QGraphicsGridLayout(windowLayout);item = new LayoutItem;grid->addItem(item, 0, 0, 4, 1);item = new LayoutItem;item->setMaximumHeight(item->minimumHeight());grid->addItem(item, 0, 1, 2, 1, Qt::AlignVCenter);item = new LayoutItem;item->setMaximumHeight(item->minimumHeight());grid->addItem(item, 2, 1, 2, 1, Qt::AlignVCenter);item = new LayoutItem;grid->addItem(item, 0, 2);item = new LayoutItem;grid->addItem(item, 1, 2);item = new LayoutItem;grid->addItem(item, 2, 2);item = new LayoutItem;grid->addItem(item, 3, 2);windowLayout->addItem(grid);
//! [2]//! [3]setLayout(windowLayout);setWindowTitle(tr("Basic Graphics Layouts Example"));
//! [3]
}
// layoutitem.h
#ifndef LAYOUTITEM_H
#define LAYOUTITEM_H#include <QGraphicsLayoutItem>
#include <QGraphicsItem>
#include <QPixmap>//! [0]
class LayoutItem : public QGraphicsLayoutItem, public QGraphicsItem
{
public:LayoutItem(QGraphicsItem *parent = nullptr);// Inherited from QGraphicsLayoutItemvoid setGeometry(const QRectF &geom) override;QSizeF sizeHint(Qt::SizeHint which, const QSizeF &constraint = QSizeF()) const override;// Inherited from QGraphicsItemQRectF boundingRect() const override;void paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget = nullptr) override;private:QPixmap m_pix;
};
//! [0]#endif // LAYOUTITEM_H
// layoutitem.cpp
#include "layoutitem.h"#include <QGradient>
#include <QPainter>//! [0]
LayoutItem::LayoutItem(QGraphicsItem *parent): QGraphicsLayoutItem(), QGraphicsItem(parent),m_pix(QPixmap(QLatin1String("../layoutdemo1-copy/block.png")))
{setGraphicsItem(this);
}
//! [0]//! [1]
void LayoutItem::paint(QPainter *painter, const QStyleOptionGraphicsItem *option,QWidget *widget)
{Q_UNUSED(widget);Q_UNUSED(option);QRectF frame(QPointF(0, 0), geometry().size());const QSizeF pmSize = m_pix.size();QGradientStops stops;
//! [1]//! [2]// paint a background rect (with gradient)QLinearGradient gradient(frame.topLeft(), frame.topLeft() + QPointF(200,200));stops << QGradientStop(0.0, QColor(60, 60,  60));stops << QGradientStop(frame.height() / 2 / frame.height(), QColor(102, 176, 54));//stops << QGradientStop(((frame.height() + h)/2 )/frame.height(), QColor(157, 195,  55));stops << QGradientStop(1.0, QColor(215, 215, 215));gradient.setStops(stops);painter->setBrush(QBrush(gradient));painter->drawRoundedRect(frame, 10.0, 10.0);// paint a rect around the pixmap (with gradient)QPointF pixpos = frame.center() - (QPointF(pmSize.width(), pmSize.height()) / 2);QRectF innerFrame(pixpos, pmSize);innerFrame.adjust(-4, -4, 4, 4);gradient.setStart(innerFrame.topLeft());gradient.setFinalStop(innerFrame.bottomRight());stops.clear();stops << QGradientStop(0.0, QColor(215, 255, 200));stops << QGradientStop(0.5, QColor(102, 176, 54));stops << QGradientStop(1.0, QColor(0, 0,  0));gradient.setStops(stops);painter->setBrush(QBrush(gradient));painter->drawRoundedRect(innerFrame, 10.0, 10.0);painter->drawPixmap(pixpos, m_pix);
}
//! [2]//! [3]
QRectF LayoutItem::boundingRect() const
{return QRectF(QPointF(0, 0), geometry().size());
}
//! [3]//! [4]
void LayoutItem::setGeometry(const QRectF &geom)
{prepareGeometryChange();QGraphicsLayoutItem::setGeometry(geom);setPos(geom.topLeft());
}
//! [4]//! [5]
QSizeF LayoutItem::sizeHint(Qt::SizeHint which, const QSizeF &constraint) const
{switch (which) {case Qt::MinimumSize:case Qt::PreferredSize:// Do not allow a size smaller than the pixmap with two frames around it.return m_pix.size() + QSize(12, 12);case Qt::MaximumSize:return QSizeF(1000,1000);default:break;}return constraint;
}
//! [5]

这篇关于Basic Graphics Layouts Example 官方示例 笔记的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/226908

相关文章

C#使用SQLite进行大数据量高效处理的代码示例

《C#使用SQLite进行大数据量高效处理的代码示例》在软件开发中,高效处理大数据量是一个常见且具有挑战性的任务,SQLite因其零配置、嵌入式、跨平台的特性,成为许多开发者的首选数据库,本文将深入探... 目录前言准备工作数据实体核心技术批量插入:从乌龟到猎豹的蜕变分页查询:加载百万数据异步处理:拒绝界面

用js控制视频播放进度基本示例代码

《用js控制视频播放进度基本示例代码》写前端的时候,很多的时候是需要支持要网页视频播放的功能,下面这篇文章主要给大家介绍了关于用js控制视频播放进度的相关资料,文中通过代码介绍的非常详细,需要的朋友可... 目录前言html部分:JavaScript部分:注意:总结前言在javascript中控制视频播放

Java中StopWatch的使用示例详解

《Java中StopWatch的使用示例详解》stopWatch是org.springframework.util包下的一个工具类,使用它可直观的输出代码执行耗时,以及执行时间百分比,这篇文章主要介绍... 目录stopWatch 是org.springframework.util 包下的一个工具类,使用它

Spring Boot 3.4.3 基于 Spring WebFlux 实现 SSE 功能(代码示例)

《SpringBoot3.4.3基于SpringWebFlux实现SSE功能(代码示例)》SpringBoot3.4.3结合SpringWebFlux实现SSE功能,为实时数据推送提供... 目录1. SSE 简介1.1 什么是 SSE?1.2 SSE 的优点1.3 适用场景2. Spring WebFlu

springboot security快速使用示例详解

《springbootsecurity快速使用示例详解》:本文主要介绍springbootsecurity快速使用示例,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝... 目录创www.chinasem.cn建spring boot项目生成脚手架配置依赖接口示例代码项目结构启用s

golang 日志log与logrus示例详解

《golang日志log与logrus示例详解》log是Go语言标准库中一个简单的日志库,本文给大家介绍golang日志log与logrus示例详解,感兴趣的朋友一起看看吧... 目录一、Go 标准库 log 详解1. 功能特点2. 常用函数3. 示例代码4. 优势和局限二、第三方库 logrus 详解1.

SpringBoot实现MD5加盐算法的示例代码

《SpringBoot实现MD5加盐算法的示例代码》加盐算法是一种用于增强密码安全性的技术,本文主要介绍了SpringBoot实现MD5加盐算法的示例代码,文中通过示例代码介绍的非常详细,对大家的学习... 目录一、什么是加盐算法二、如何实现加盐算法2.1 加盐算法代码实现2.2 注册页面中进行密码加盐2.

Redis 中的热点键和数据倾斜示例详解

《Redis中的热点键和数据倾斜示例详解》热点键是指在Redis中被频繁访问的特定键,这些键由于其高访问频率,可能导致Redis服务器的性能问题,尤其是在高并发场景下,本文给大家介绍Redis中的热... 目录Redis 中的热点键和数据倾斜热点键(Hot Key)定义特点应对策略示例数据倾斜(Data S

JavaScript Array.from及其相关用法详解(示例演示)

《JavaScriptArray.from及其相关用法详解(示例演示)》Array.from方法是ES6引入的一个静态方法,用于从类数组对象或可迭代对象创建一个新的数组实例,本文将详细介绍Array... 目录一、Array.from 方法概述1. 方法介绍2. 示例演示二、结合实际场景的使用1. 初始化二

C#中的 StreamReader/StreamWriter 使用示例详解

《C#中的StreamReader/StreamWriter使用示例详解》在C#开发中,StreamReader和StreamWriter是处理文本文件的核心类,属于System.IO命名空间,本... 目录前言一、什么是 StreamReader 和 StreamWriter?1. 定义2. 特点3. 用