Qt工作笔记-图形视图框架中的分组,以及添加平行拖动图元

啥意思,感觉本人语文学得菜,不好描述。

直接看程序运行截图:

1.隐藏鼠标;

2.图元分组;

3.视图与场景坐标转换

程序源码如下:

mygraphicsitem.h

#ifndef MYGRAPHICSITEM_H
#define MYGRAPHICSITEM_H

#include <QGraphicsItem>

class MyGraphicsItem:public QGraphicsItem
{
public:
    MyGraphicsItem(QGraphicsItem *parent=0);

    QRectF boundingRect()const;
    void paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget);
};

#endif // MYGRAPHICSITEM_H

mygraphicsview.h

#ifndef MYGRAPHICSVIEW_H
#define MYGRAPHICSVIEW_H

#include <QGraphicsView>
class MyGraphicsItem;

class MyGraphicsView:public QGraphicsView
{
    Q_OBJECT
public:
    MyGraphicsView(QWidget *parent=0);
    ~MyGraphicsView();

    void mousePressEvent(QMouseEvent *event);
    void mouseReleaseEvent(QMouseEvent *event);
    void mouseMoveEvent(QMouseEvent *event);

    void setStartAndEndItem(MyGraphicsItem *start, MyGraphicsItem *end);

private:
    qreal m_itemPosX;
    qreal m_itemPosY;
    qreal m_changedPosX;
    MyGraphicsItem *m_item;
    MyGraphicsItem *m_startItem;
    MyGraphicsItem *m_endItem;

};

#endif // MYGRAPHICSVIEW_H

widget.h

#ifndef WIDGET_H
#define WIDGET_H

#include <QWidget>
class QGraphicsScene;

namespace Ui {
class Widget;
}

class Widget : public QWidget
{
    Q_OBJECT

public:
    explicit Widget(QWidget *parent = 0);
    ~Widget();

private:
    Ui::Widget *ui;
    QGraphicsScene *m_scene;
};

#endif // WIDGET_H

main.cpp

#include "widget.h"
#include <QApplication>

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    Widget w;
    w.show();

    return a.exec();
}

mygraphicsitem.cpp

#include "mygraphicsitem.h"
#include <QPainter>

MyGraphicsItem::MyGraphicsItem(QGraphicsItem *parent):
    QGraphicsItem(parent)
{

}

QRectF MyGraphicsItem::boundingRect() const
{
    qreal penWidth=1;
    return QRectF(0-penWidth/2,0-penWidth/2,50+penWidth,50+penWidth);
}

void MyGraphicsItem::paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget)
{
    Q_UNUSED(option)
    Q_UNUSED(widget)
    painter->setPen(QPen(Qt::red,2));
    painter->drawRect(0,0,50,50);
}

mygrpahicsview.cpp

#include "mygraphicsview.h"
#include <QDebug>
#include <QGraphicsScene>
#include "mygraphicsitem.h"
#include <QMouseEvent>

MyGraphicsView::MyGraphicsView(QWidget *parent):
    QGraphicsView(parent)
{

}

MyGraphicsView::~MyGraphicsView()
{

}

void MyGraphicsView::mousePressEvent(QMouseEvent *event)
{
    m_changedPosX=event->x();
    m_item=new MyGraphicsItem;
    m_item->setPos(m_startItem->pos());
    scene()->addItem(m_item);
    setCursor(Qt::BlankCursor);
    QGraphicsView::mousePressEvent(event);
}

void MyGraphicsView::mouseReleaseEvent(QMouseEvent *event)
{
    setCursor(Qt::ArrowCursor);
    delete m_item;
    QGraphicsView::mouseReleaseEvent(event);
}

void MyGraphicsView::mouseMoveEvent(QMouseEvent *event)
{
    qDebug()<<"最右端:"<<m_itemPosX+event->pos().x()-m_changedPosX<<"  "<<m_endItem->pos().x();
    qDebug()<<"最左端:"<<m_itemPosX+event->pos().x()-m_changedPosX<<"  "<<m_startItem->pos().x();
    if(m_itemPosX+event->pos().x()-m_changedPosX>m_endItem->pos().x()
            ||m_itemPosX+event->pos().x()-m_changedPosX<m_startItem->pos().x()){
        return;
    }
    m_item->setPos(m_itemPosX+event->pos().x()-m_changedPosX,m_itemPosY);
}

void MyGraphicsView::setStartAndEndItem(MyGraphicsItem *start,MyGraphicsItem *end)
{
    m_startItem=start;
    m_endItem=end;
    m_itemPosX=m_startItem->pos().x();
    m_itemPosY=m_startItem->pos().y();
}

widget.cpp

#include "widget.h"
#include "ui_widget.h"
#include <QGraphicsScene>
#include <QMouseEvent>
#include <QDebug>
#include <QGraphicsItemGroup>
#include "mygraphicsitem.h"

Widget::Widget(QWidget *parent) :
    QWidget(parent),
    ui(new Ui::Widget)
{
    ui->setupUi(this);
    m_scene=new QGraphicsScene;
    ui->graphicsView->setScene(m_scene);
    MyGraphicsItem *startItem=new MyGraphicsItem;
    startItem->setPos(-300,0);

    MyGraphicsItem *endItem=new MyGraphicsItem;
    endItem->setPos(300,0);

    QGraphicsItemGroup *group=new QGraphicsItemGroup;
    group->addToGroup(startItem);
    group->addToGroup(endItem);
    group->setFlags(QGraphicsItem::ItemIsSelectable|QGraphicsItem::ItemIsMovable);
    m_scene->addItem(group);

    ui->graphicsView->setStartAndEndItem(startItem,endItem);
}

Widget::~Widget()
{
    delete ui;
}

猜你喜欢

转载自blog.csdn.net/qq78442761/article/details/81302590