当前位置: 首页 > news >正文

QT传输函数控件设计8 设计小圆点

首先看一下小圆点:

如图,左图上有很多小圆点,这些小圆点是由蓝色的中心和红边构成。点击小圆点的时候,小圆点的红边会消失,松开鼠标红边又会出现。

我们首先要把这些小圆点能够显示在QGraphicsView上面,还记得之前讲过的图形项嘛?每个小圆点就是一个图形项。现在我们就开始设计图形项类。因为这是圆的,所以我们就继承一个QGraphicsEllipse椭圆类。

#ifndef __NodeGraphicsItem_H__
#define __NodeGraphicsItem_H__

#include <QGraphicsEllipseItem>
#include <QPainter>

class NodeGraphicsItem : public QGraphicsEllipseItem {

public:
	NodeGraphicsItem& operator = (const NodeGraphicsItem& Other) {
		brushColor = Other.brushColor;
		pen = Other.pen;
		return *this;
	}
	NodeGraphicsItem(const NodeGraphicsItem& Other)
	{
		*this = Other;
	};
public:
	NodeGraphicsItem(QGraphicsEllipseItem * parent = Q_NULLPTR);
	~NodeGraphicsItem();

private:

	QBrush brushColor;
	QPen pen;

private:
	void mousePressEvent(QGraphicsSceneMouseEvent *event);
	void mouseReleaseEvent(QGraphicsSceneMouseEvent *event);
	void hoverEnterEvent(QGraphicsSceneHoverEvent *event);
	void paint(QPainter * painter, const QStyleOptionGraphicsItem * option, QWidget * widget = 0);
	QVariant itemChange(GraphicsItemChange change, const QVariant &value) override;
};

#endif

我们先把之前学的那些函数都搞进去,然后把这些函数体填充一下:

NodeGraphicsItem::NodeGraphicsItem(QGraphicsEllipseItem * parent) : QGraphicsEllipseItem(parent),
brushColor(QColor(0, 190, 27))
{
	setZValue(1000000);
	pen.setWidth(2);
	pen.setColor(Qt::red);
	setPen(pen);
	setBrush(brushColor);
	setRect(-5,-5,10,10);
	setFlags(QGraphicsItem::ItemIsFocusable | QGraphicsItem::ItemIsSelectable 
		| QGraphicsItem::ItemIsMovable | QGraphicsItem::ItemSendsGeometryChanges);
	setAcceptHoverEvents(true);
}

NodeGraphicsItem::~NodeGraphicsItem() {
	
}

注意在这个函数里面,我们把Z值设置非常大,因为它一定要在所有东西的最上面。然后设置笔和刷子。然后设置椭圆的边界:setRect,因为这个椭圆是相当于设置的方形的内切圆。然后设置它可以移动可以选择可以设置焦点可以设置边界可以悬停等一大堆属性。

// 鼠标按下事件处理函数,设置被点击的图形项获得焦点,并改变光标外观
void NodeGraphicsItem::mousePressEvent(QGraphicsSceneMouseEvent * pEvent)
{
	QGraphicsItem::mousePressEvent(pEvent);
	setFocus();
}

void NodeGraphicsItem::mouseReleaseEvent(QGraphicsSceneMouseEvent * pEvent)
{
	QGraphicsItem::mouseReleaseEvent(pEvent);
	clearFocus();

}

在事件处理中,有鼠标事件以后就设置或者清除焦点。

void NodeGraphicsItem::paint(QPainter * painter, const QStyleOptionGraphicsItem * option, QWidget * widget)
{
	if (hasFocus()) {
		painter->setPen(QPen(QColor(255, 255, 0)));
	}
	else {
		painter->setPen(pen);
	}
	painter->setBrush(QColor(0, 190, 27));
	painter->drawEllipse(-5,-5,10,10);
}

设置重绘,当有焦点的时候说明你鼠标点在了这上面,所以就设置一个特殊的被选中的颜色。如果没有焦点就画回原来的样子。

QVariant NodeGraphicsItem::itemChange(GraphicsItemChange change, const QVariant &value)
{
	if (change == ItemPositionChange && scene())
	{
		QPointF newPos = value.toPointF();
		
		QRectF rect(0,0,100,100 );//先随便设置一下
		if (!rect.contains(newPos))
		{
			newPos.setX(qMin(rect.right(), qMax(newPos.x(), rect.left())));
			newPos.setY(qMin(rect.bottom(), qMax(newPos.y(), rect.top())));
			return newPos;
		}
	}
	return QGraphicsItem::itemChange(change, value);
}

这个函数因为边界什么的都没有,这里先随便设置一下,以后再回来重新设置。

现在已经有了一个初步的NodeGraphicsItem小圆点,下一步我们就设置一个QGraphicsView类来安置这些小圆点。

相关文章:

  • QT传输函数控件设计9 初步设计视口类
  • QT传输函数控件设计10 包含小圆点的图形项
  • QT传输函数控件设计11 包含小圆点的图形项2
  • QT传输函数控件设计12 自定义信号和槽
  • QT传输函数控件设计13 大结局
  • QT三维图形1
  • QT三维图形2
  • QT三维图形3
  • QT三维图形4
  • icache的方面以及使用
  • cmp bne 以及sub指令的详解
  • 关于ARM Cortex a 系列的看门狗定时器
  • C语言之 认识可变参数
  • ARM cortex a 的SDRAM (DDR)
  • C语言 之递归函数
  • JavaScript-如何实现克隆(clone)函数
  • [数据结构]链表的实现在PHP中
  • 【Linux系统编程】快速查找errno错误码信息
  • 2017届校招提前批面试回顾
  • angular2 简述
  • flask接收请求并推入栈
  • Golang-长连接-状态推送
  • gops —— Go 程序诊断分析工具
  • Intervention/image 图片处理扩展包的安装和使用
  • JAVA 学习IO流
  • java架构面试锦集:开源框架+并发+数据结构+大企必备面试题
  • sessionStorage和localStorage
  • 回流、重绘及其优化
  • 京东美团研发面经
  • 让你的分享飞起来——极光推出社会化分享组件
  • 项目管理碎碎念系列之一:干系人管理
  • 《码出高效》学习笔记与书中错误记录
  • #pragma multi_compile #pragma shader_feature
  • (31)对象的克隆
  • (C#)Windows Shell 外壳编程系列9 - QueryInfo 扩展提示
  • (cos^2 X)的定积分,求积分 ∫sin^2(x) dx
  • (定时器/计数器)中断系统(详解与使用)
  • (附源码)ssm码农论坛 毕业设计 231126
  • (一)Mocha源码阅读: 项目结构及命令行启动
  • (转) ns2/nam与nam实现相关的文件
  • (转)C#调用WebService 基础
  • (转)机器学习的数学基础(1)--Dirichlet分布
  • (转)四层和七层负载均衡的区别
  • ***详解账号泄露:全球约1亿用户已泄露
  • .NET Core日志内容详解,详解不同日志级别的区别和有关日志记录的实用工具和第三方库详解与示例
  • /proc/stat文件详解(翻译)
  • @Autowired和@Resource的区别
  • @Conditional注解详解
  • [3D基础]理解计算机3D图形学中的坐标系变换
  • [ASP.NET MVC]如何定制Numeric属性/字段验证消息
  • [AutoSar]BSW_Com07 CAN报文接收流程的函数调用
  • [BJDCTF 2020]easy_md5
  • [BZOJ5125]小Q的书架(决策单调性+分治DP+树状数组)
  • [C++]类和对象【上篇】
  • [ChromeApp]指南!让你的谷歌浏览器好用十倍!