Qt第十七天

本文详细介绍了Qt编程中QGraphicsView组件的基本结构和功能实现,包括mainwindow.h和qwgraphicsview.h的头文件定义,以及mainwindow.cpp和qwgraphicsview.cpp的源代码实现。通过这些内容,读者可以理解如何在Qt应用中使用QGraphicsView来展示和操作图形元素。

QGraphicsView程序基本结构和功能实现

mainwindow.h

#ifndef MAINWINDOW_H
#define MAINWINDOW_H


#include <QMainWindow>
#include <QLabel>
#include<QGraphicsScene>
#include<QGraphicsItem>
#include"qwgraphicsview.h"


namespace Ui {
class MainWindow;
}


class MainWindow : public QMainWindow
{
Q_OBJECT
private:
    QGraphicsScene  *scene;
    QLabel  *labViewCord;
    QLabel  *labSceneCord;
    QLabel  *labItemCord;
    void iniGraphicsSystem(); //创建Graphics View的各项


protected:
    void resizeEvent(QResizeEvent *event);//重定义了resizeEvent()事件


private slots:
    void on_mouseMovePoint(QPoint point);


    void on_mouseClicked(QPoint point);


public:
explicit MainWindow(QWidget *parent = nullptr);
~MainWindow();


private:
Ui::MainWindow *ui;
};


#endif // MAINWINDOW_H


qwgraphicsview.h

#ifndef QWGRAPHICSVIEW_H
#define QWGRAPHICSVIEW_H
#include<QGraphicsView>
#include <QObject>
#include<qwgraphicsview.h>
#include"mainwindow.h"


/**
 * 从QGraphicsView类继承一个类
 * 实现mouseMoveEvent和mousePressEvent事件
 * 把鼠标事件转换为信号,在主程序中设计槽函数响应这些鼠标事件
 **/
class QWGraphicsView : public QGraphicsView
{
    Q_OBJECT
protected:
    void mouseMoveEvent(QMouseEvent *event);
    void mousePressEvent(QMouseEvent *event);
public:
    QWGraphicsView(QWidget *parent=nullptr);


signals:
    void mouseMovePoint(QPoint point);
    void mouseClicked(QPoint point);


};


#endif // QWGRAPHICSVIEW_H


mainwindow.cpp

#include "mainwindow.h"
#include "ui_mainwindow.h"
#include"qwgraphicsview.h"
#include<QFlags>
#include<QPen>
#include<QGraphicsEllipseItem>
#include<QBrush>


MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MainWindow)
{
ui->setupUi(this);
labViewCord=new QLabel("View 坐标:");
labViewCord->setMinimumWidth(150);
ui->statusBar->addWidget(labViewCord);
labSceneCord=new QLabel("Sence 坐标:");
labSceneCord->setMinimumWidth(150);
ui->statusBar->addWidget(labSceneCord);
labItemCord=new QLabel("Item 坐标:");
labItemCord->setMinimumWidth(150);
ui->statusBar->addWidget(labItemCord);
ui->View->setCursor(Qt::CrossCursor);//指针
ui->View->setMouseTracking(true);//该属性用来设置某个控件是否被跟踪轨迹。
ui->View->setDragMode(QGraphicsView::RubberBandDrag);
QObject::connect(ui->View,SIGNAL(mouseMovePoint(QPoint)),this,SLOT(on_mouseMovePoint(QPoint)));
QObject::connect(ui->View,SIGNAL(mouseClicked(QPoint)),this,SLOT(on_mouseClicked(QPoint)));
iniGraphicsSystem();
}


MainWindow::~MainWindow()
{
delete ui;
}
/**
 * @brief MainWindow::on_mouseClicked
 * @param point
 */
void MainWindow::on_mouseClicked(QPoint point)//鼠标点击事件
{
    QPointF pointScene=ui->View->mapToScene(point);//转换到Scene坐标
    QGraphicsItem *item=nullptr;
    item=scene->itemAt(pointScene,ui->View->transform());//获取光标下的图形项
    if(item!=nullptr)//判断是否有图形项
    {
        QPointF pointItem=item->mapFromScene(pointScene);//图形项的局部坐标
        labItemCord->setText(QString::asprintf("Item坐标:%。0f,%。0f",pointItem.x(),pointItem.y()));
    }
}
/**
 * @brief MainWindow::on_mouseMovePoint
 * @param point
 */
void MainWindow::on_mouseMovePoint(QPoint point)
/*
 * 鼠标移动事件
 * point是GraphicsView的坐标
 * 是物理坐标
 */
{
    labViewCord->setText(QString::asprintf("View坐标:%d,%d",point.x(),point.y()));
    QPointF pointScene=ui->View->mapToScene(point);//转换到Scene坐标
    labSceneCord->setText(QString::asprintf("Sence坐标:%.0f,%.0f",pointScene.x(),pointScene.y()));
}
/**
 * @brief MainWindow::resizeEvent
 * @param event
 */
void MainWindow::resizeEvent(QResizeEvent *event)//窗口变化时事件
{
    Q_UNUSED(event);
    ui->label->setText(QString::asprintf("Graphics View坐标,左上角总是(0,0),宽度=%d,高度=%d",ui->View->width(),ui->View->height()));
    QRectF rectF=ui->View->sceneRect();//
    ui->label_2->setText(QString::asprintf("GraphcsView::sceneRect=(Left,Top,Width,Height)=%.0f,%.0f,%.0f,%.0f",
                                           rectF.left(),rectF.top(),rectF.width(),rectF.height()));
}
void MainWindow::iniGraphicsSystem()//构造Graphics View中的各项
{
    QRectF   rect(-200,-100,400,200);//左上角的坐标,宽度,高度
    scene=new QGraphicsScene(rect);//scene逻辑坐标系定义
    ui->View->setScene(scene);
    //画一个矩形,大小等于scene
    QGraphicsRectItem *item=new QGraphicsRectItem(rect);
    item->setFlags(QGraphicsItem::ItemIsSelectable|//设置flags
                   //QGraphicsItem::ItemIsMovable|
                   QGraphicsItem::ItemIsFocusable);
    QPen pen;
    pen.setWidth(2);
    item->setPen(pen);
    scene->addItem(item);
    //画一个位于scene中心的椭圆
    QGraphicsEllipseItem *item2=new QGraphicsEllipseItem(-100,-50,200,100);
    item2->setPos(0,0);
    item2->setBrush(QBrush(Qt::blue));
    item2->setFlags(QGraphicsItem::ItemIsSelectable|
                    QGraphicsItem::ItemIsMovable|
                    QGraphicsItem::ItemIsFocusable);
    scene->addItem(item2);
    //画一个圆,中心位于scene的边缘
    QGraphicsEllipseItem *item3=new QGraphicsEllipseItem(-50,-50,100,100);
    item3->setPos(rect.right(),rect.bottom());
    item3->setBrush(QBrush(Qt::red));
    item3->setFlags(QGraphicsItem::ItemIsSelectable|
                    QGraphicsItem::ItemIsMovable|
                    QGraphicsItem::ItemIsFocusable);
    scene->addItem(item3);
    scene->clearSelection();
}


qwgraphicsview.cpp

#include "qwgraphicsview.h"
#include<QPoint>
#include<QMouseEvent>
/**
 * @brief QWGraphicsView::QWGraphicsView
 * @param parent
 */
QWGraphicsView::QWGraphicsView(QWidget *parent):QGraphicsView(parent)
{


}
/**
 * @brief QWGraphicsView::mouseMoveEvent
 * @param event
 */
void QWGraphicsView::mouseMoveEvent(QMouseEvent *event)//鼠标移动事件
{
    QPoint point=event->pos();//QGraphicsView的坐标
    emit mouseMovePoint(point);//发射信号
    QGraphicsView::mouseMoveEvent(event);
}
/**
 * @brief QWGraphicsView::mousePressEvent
 * @param event
 */
void QWGraphicsView::mousePressEvent(QMouseEvent *event)
{
    if(event->button()==Qt::LeftButton)//判断按下鼠标左键
    {
        QPoint point=event->pos();//获取坐标
        emit mouseClicked(point);//发射信号
    }
    QGraphicsView::mousePressEvent(event);
}


运行结果
在这里插入图片描述

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值