二十五、Qt之自定义图形视图组件,扩展基础 Widget 功能,以 QGraphicsView 组件为例

一、使用场景

QGraphicsView 是 Qt 的图形视图组件,在 UI 设计器的 Display Widget 分组里可以拖放一个 QGraphicsView 组件到窗口上。但遇到下面的场景时:当鼠标在 QGraphicsView 上移动时就显示当前光标的坐标,这涉及到 mouseMoveEvent() 事件的处理。但是 QGraphicsView 并没有与 mouseMoveEvent() 相关的信号,因而无法定义槽函数与此事件相关联。
为此,从 QGraphicsView 继承定义一个类 QwGraphicsView,实现 mouseMoveEvent() 事件和 mousePressEvent() 事件,并把鼠标事件转换为信号,这样就可以在主程序里设计槽函数响应这些鼠标事件。

二、使用

(一)自定义 QwGraphicsView 继承 QGraphicsView

QwGraphicsView定义如下:

QwGraphicsView .h

#include <QtWidgets/QWidget>
#include <QGraphicsView>
#include <QPoint>
#include <QMouseEvent>

/**
 *     QGraphicsView 有 mouseMoveEvent() 和 mousePressEvent() 事件,但是没有与之相关
 * 的信号,所以这里继承该类,来绑定自定义信号:mouseMovePoint(QPoint point)、
 * mouseClicked(QPoint point)
 */
class QwGraphicsView :
	public QGraphicsView
{
	Q_OBJECT
protected:
	void mouseMoveEvent(QMouseEvent* event) Q_DECL_OVERRIDE;
	void mousePressEvent(QMouseEvent* event) Q_DECL_OVERRIDE;
public:
	QwGraphicsView(QWidget* parent = 0);
signals:
	void mouseMovePoint(QPoint point);
	void mouseClicked(QPoint point);
};

QwGraphicsView .cpp

#include "QwGraphicsView.h"

QwGraphicsView::QwGraphicsView(QWidget* parent):QwGraphicsView(parent)
{

}

void QwGraphicsView::mouseMoveEvent(QMouseEvent* event)
{
	QPoint point = event->pos();
	emit mouseMovePoint(point);
	QGraphicsView::mouseMoveEvent(event);
}

void QwGraphicsView::mousePressEvent(QMouseEvent* event)
{
	if (event->button() == Qt::LeftButton)
	{
		QPoint point = event->pos();
		emit mouseClicked(point);
	}
	QGraphicsView::mousePressEvent(event);
}
(二)将 QGraphicsView 升级为 QwGraphicsView

在设计界面时,先从组件面板里放一个 QGraphicsView 组件到窗口上,然后选中该组件右击,在快捷菜单中选择 “提升为…”,出现如下图对话框。在其中选择基类名称 QGraphicsView ,升级类名称输入 QwGraphicsView,然后单击 “添加” 按钮,再点击 “提升” 按钮,就可以将窗口上的 QGraphicsView 组件升级为 QwGraphicsView 组件,使用自定义事件和信号。
在这里插入图片描述

Qt QGraphicsView是一个强大的图形界面框架,可以让用户轻松地在图形视图中显示和编辑图形元素。在Qt中,QGraphicsItem是QGraphicsScene中的基本元素,它可以表示任何类型的图形图元,如线条、多边形、文本、图像等。在本文中,我们将介绍如何使用Qt QGraphicsView创建自定义图元。 1. 创建自定义图元类 首先,我们需要创建一个自定义图元类,继承自QGraphicsItem。这个类可以是任何自定义图形元素,比如矩形、圆形、多边形等。在这里,我们将创建一个简单的矩形图元类。 class MyRectItem : public QGraphicsItem { public: MyRectItem(QGraphicsItem *parent = nullptr); QRectF boundingRect() const override; void paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget) override; }; 2. 实现boundingRect和paint函数 在自定义图元类中,我们需要实现boundingRect和paint函数。boundingRect函数返回一个QRectF对象,用于定义图元的边界框。paint函数用于绘制图元。 QRectF MyRectItem::boundingRect() const { return QRectF(-50, -50, 100, 100); } void MyRectItem::paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget) { Q_UNUSED(option) Q_UNUSED(widget) painter->setPen(QPen(Qt::black, 2)); painter->setBrush(QColor(255, 0, 0, 50)); painter->drawRect(-50, -50, 100, 100); } 3. 在场景中添加图元 在主程序中,我们可以创建一个QGraphicsScene对象,并在其中添加自定义的图元对象。然后,我们可以使用QGraphicsView来显示这个场景。 QGraphicsScene *scene = new QGraphicsScene; MyRectItem *rectItem = new MyRectItem; scene->addItem(rectItem); QGraphicsView *view = new QGraphicsView(scene); view->show(); 4. 运行程序 现在,我们可以运行程序,并看到我们刚刚创建的矩形图元。可以通过移动、缩放、旋转等操作来编辑图元。 通过这个简单的例子,我们可以看到如何使用Qt QGraphicsView创建自定义图元。可以扩展这个例子来创建更复杂的图元,比如多边形、文本、图像等。
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值