【Qt图形视图框架】自定义QGraphicsItem和QGraphicsView,实现鼠标(移动、缩放)及键盘事件、右键事件

这篇具有很好参考价值的文章主要介绍了【Qt图形视图框架】自定义QGraphicsItem和QGraphicsView,实现鼠标(移动、缩放)及键盘事件、右键事件。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

说明

在使用Qt的图形视图框架实现功能时,一般会在其基础上进行自定义功能实现。
如:滚轮对场景的缩放,鼠标拖动场景中的项,以及可以在场景中进行右键操作等。

示例

myitem为自定义QGraphicsItem,实现了边框、重绘事件、鼠标悬停、按键、右键菜单等功能。

myitem.h
#ifndef MYITEM_H
#define MYITEM_H

#include <QGraphicsItem>

class MyItem : public QGraphicsItem
{
public:
    MyItem();
    // 边框
    virtual QRectF boundingRect() const override;
    // 重绘事件
    virtual void paint(QPainter *painter, const QStyleOptionGraphicsItem *option,
               QWidget *widget) override;
    // 设置笔刷
    inline void setColor(const QColor &color) {brushColor = color;}

protected:
    // 鼠标按下函数,设置被点击的图形项得到焦点,并改变光标外观
    virtual void keyPressEvent(QKeyEvent *event) override;
    // 键盘按下函数,判断是不是向下方向键,若是是,则向下移动图形项
    virtual void mousePressEvent(QGraphicsSceneMouseEvent *event) override;
    // 悬停事件函数,设置光标外观和提示
    virtual void hoverEnterEvent(QGraphicsSceneHoverEvent *event) override;
    // 右键菜单函数,为图形项添加一个右键菜单
    virtual void contextMenuEvent(QGraphicsSceneContextMenuEvent *event) override;

private:
    QColor brushColor; // 笔刷颜色
};
#endif // MYITEM_H
myitem.cpp
#include "myitem.h"
#include <QPainter>
#include <QCursor>
#include <QKeyEvent>
#include <QGraphicsSceneHoverEvent>
#include <QGraphicsSceneContextMenuEvent>
#include <QMenu>

#define WIDTH 40
#define HEIGHT 40

#define POS 20

MyItem::MyItem()
{
    brushColor = Qt::black;

    setFlag(QGraphicsItem::ItemIsFocusable);
    setFlag(QGraphicsItem::ItemIsMovable);
    setAcceptHoverEvents(true);

}

QRectF MyItem::boundingRect() const
{
    qreal adjust = 0.5; // 返回上下左右+0.5个像素
    return QRectF(-POS - adjust, -POS - adjust,
                  WIDTH + adjust, HEIGHT + adjust);
}

void MyItem::paint(QPainter *painter, const QStyleOptionGraphicsItem *,
                   QWidget *)
{
    if (hasFocus()) {
        painter->setPen(QPen(QColor(255, 255, 255)));
    } else {
        painter->setPen(QPen(QColor(100, 100, 100)));
    }
    painter->setBrush(brushColor);
    painter->drawRect(-POS, -POS, WIDTH, HEIGHT);
}

void MyItem::mousePressEvent(QGraphicsSceneMouseEvent *e)
{
    setFocus();
    // 设置光标为手握下的形状
    setCursor(Qt::ClosedHandCursor);
    QGraphicsItem::mousePressEvent(e);
}

void MyItem::keyPressEvent(QKeyEvent *event)
{
    if (Qt::Key_Down == event->key())
        moveBy(0, 10);
    else if(Qt::Key_Up == event->key())
        moveBy(0, -10);
    else if(Qt::Key_Left == event->key())
        moveBy(-10, 0);
    else if(Qt::Key_Right == event->key())
        moveBy(10, 0);
    else{

    }
    QGraphicsItem::keyPressEvent(event);
}

void MyItem::hoverEnterEvent(QGraphicsSceneHoverEvent *)
{
    // 设置光标为手张开的形状
    setCursor(Qt::OpenHandCursor);
    setToolTip("click me");
}

void MyItem::contextMenuEvent(QGraphicsSceneContextMenuEvent *event)
{
    QMenu menu;
    QAction *moveAction = menu.addAction("move origin");
    QAction *selectedAction = menu.exec(event->screenPos());
    if (selectedAction == moveAction) {
        setPos(0, 0);
    }
}

myview.h

myview继承QGraphicsView,重新实现了滚轮事件,可对场景进行缩放操作

#ifndef MYVIEW_H
#define MYVIEW_H

#include <QObject>
#include <QGraphicsView>

class MyView : public QGraphicsView
{
    Q_OBJECT
public:
    explicit MyView(QWidget *parent = 0);

protected:
    // 滚轮事件:缩放
    virtual void wheelEvent(QWheelEvent *event) override;
};
#endif // MYVIEW_H

myview.cpp
#include "myview.h"

#include "myview.h"
#include <QKeyEvent>

MyView::MyView(QWidget *parent) :
    QGraphicsView(parent)
{
}

void MyView::wheelEvent(QWheelEvent *event)
{
    if(event->delta() > 0)
    {
        scale(1.1, 1.1);
    }else{
        scale(0.9, 0.9);
    }
    // 加上这个,否则在场景和图形项中就没法再接收到该事件了
    QGraphicsView::wheelEvent(event);
}


调用
main.cpp
#include <QApplication>

#include "myitem.h"
#include "myview.h"
#include <QTime>
#include <QtMath>

#include <QDebug>


int main(int argc, char* argv[ ])
{
    QApplication app(argc, argv);
    qsrand(QTime(0, 0, 0).secsTo(QTime::currentTime()));
    QGraphicsScene scene;
    // 设置场景尺寸,减少动态渲染
    scene.setSceneRect(-300, -225, 600, 450);
	// 创建项
    for (int i = 0; i < 5; ++i) {
        MyItem *item = new MyItem;
        item->setColor(QColor(qrand() % 256, qrand() % 256, qrand() % 256));
        item->setPos(i * 50 - 100, -50);
        scene.addItem(item);
    }
	// 声明视图
    MyView view;
    view.setScene(&scene);
    // 设置背景刷
    view.setBackgroundBrush(QBrush(QColor(220, 220, 220)));
    view.show();

    return app.exec();
}

效果

显示效果如下:

自定义图形视图文章来源地址https://www.toymoban.com/news/detail-759470.html

到了这里,关于【Qt图形视图框架】自定义QGraphicsItem和QGraphicsView,实现鼠标(移动、缩放)及键盘事件、右键事件的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Qt5开发及实例V2.0-第七章-Qt图形视图框架

    7.1.1 Graphics View的特点 Graphics View框架结构的主要特点如下。 (1)Graphics View框架结构中,系统可以利用Qt绘图系统的反锯齿、OpenGL工具来改善绘图性能。 (2)Graphics View支持事件传播体系结构,可以使图元在场景(scene)中的交互能力提高1倍,图元能够处理键盘事件和鼠标事

    2024年02月07日
    浏览(34)
  • Qt中QGraphicsView架构下实时鼠标绘制图形

    上一章节介绍了关于QGraphicsView的基础讲解,以及简单的类图创建,由上一章节中最后展示的动画效果来看,今年主要讲述如何在QGraphicsView架构下,实时拖动鼠标绘制图形! 今天主要以矩形为例,再来看一下展示效果吧! 想要实现鼠标拖拽绘图的效果,离不开鼠标的三大事件

    2024年01月22日
    浏览(35)
  • [QT编程系列-7]:C++图形用户界面编程,QT框架快速入门培训 - 3- QT窗体设计 - 自定义工具栏、状态栏、快捷键、图标

    目录 3. QT窗体设计 3.2 自定义工具栏 3.2.1 目标 3.2.2 实现过程 3.2 自定义状态栏 3.2.1  目标 3.2.2  过程 3.3 自定义动作快捷键 3.4 自定义图标 在Qt中,ToolBar(工具栏)是一种常见的GUI元素,用于提供应用程序的常用工具按钮和操作。工具栏通常包含一系列图标按钮,用于执

    2024年02月15日
    浏览(39)
  • Qt之QGraphicsView实现截图(漏洞百出且BUG丛生版,部分源码+注释)

    下方一次绘制的图元为:矩形、圆形、箭头、画笔。 下方为添加文本操作,演示文本过多时,文本框便捷不超出编辑区边界。 下方为演示设置弹窗更新画笔颜色、画笔粗细更新后的绘制效果。 下方为截图图片拖动效果,仅支持未添加图元的情况。 下方操作为截图保存当前截

    2024年02月02日
    浏览(29)
  • QGraphicsView 如何让图形大小适配窗口

    setSceneRect是一个Qt中的函数,用于设置QGraphicsView中的场景矩形(QRectF)。 QGraphicsView是一个用于显示和编辑图形场景的控件,而setSceneRect函数用于设置场景矩形,即指定场景的可视区域的大小和位置。具体来说,它的作用有以下几个方面: 定义场景的大小:通过设置场景矩形

    2024年01月24日
    浏览(28)
  • Qt QGraphicsItem获取鼠标位置对应图像坐标

    本次使用了QGraphicsView来加载图像,然后给其设置了一个QGraphicsScene场景,再给场景添加了一个自定义的QGraphicsItem,在其中重写了paint事件,用来重绘图像。 正常情况时,QGraphicsItem上图像的有效区域QRect大小和QGraphicsView一致,此时正好铺满,鼠标位置的坐标可以比较轻松的推

    2024年01月22日
    浏览(31)
  • 界面开发框架Qt新手入门教程:Dir视图使用实例

    Qt 是目前最先进、最完整的跨平台C++开发工具。它不仅完全实现了一次编写,所有平台无差别运行,更提供了几乎所有开发过程中需要用到的工具。如今,Qt已被运用于超过70个行业、数千家企业,支持数百万设备及应用。 点击获取Qt Widget组件下载 本示例演示了树形视图的用

    2024年02月08日
    浏览(35)
  • 【Qt之模型视图】2. 模型类及QModelIndex模型索引、自定义模型

    在模型/视图体系结构中,模型提供了一个标准接口,视图和委托使用该接口访问数据。在Qt中,标准接口是由QAbstractItemModel类定义的。无论数据项如何存储在任何底层数据结构中,QAbstractItemModel的所有子类都会以层次结构来表示数据,这个结构包含了数据项表。视图使用约定

    2024年01月19日
    浏览(39)
  • 【QT性能优化】QT性能优化之QT6框架高性能模型视图代理框架千万级数据表分页查询优化

    QT性能优化之QT6框架高性能模型视图代理框架千万级数据表分页查询优化 简介 本文介绍了QT模型视图代理框架中的QT表格控件和QT数据库模块中的QT数据库查询模型结合使用的一个应用实践案例:QT高性能表格控件分页展示千万行数据。本文介绍了这个应用实践案例的运行效果

    2024年02月14日
    浏览(36)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包