一、简介
二、运行图
三、详解
1、QGraphicsScene
-
#ifndef MYSCENE_H
-
#define MYSCENE_H
-
-
#include <QGraphicsScene>
-
#include <QGraphicsSceneMouseEvent>
-
#include <QPaintEvent>
-
#include <QKeyEvent>
-
-
class MyScene : public QGraphicsScene
-
{
-
Q_OBJECT
-
public:
-
explicit MyScene(QObject *parent = 0);
-
-
protected:
-
void keyPressEvent(QKeyEvent *event);
-
void mousePressEvent(QGraphicsSceneMouseEvent *event);
-
-
signals:
-
-
public slots:
-
-
};
-
-
#endif // MYSCENE_H
-
#include "myscene.h"
-
-
MyScene::MyScene(QObject *parent) :
-
QGraphicsScene(parent)
-
{
-
clearFocus();
-
}
-
-
void MyScene::keyPressEvent(QKeyEvent *event)
-
{
-
qDebug("*********MyScene::keyPressEvent***************");
-
return QGraphicsScene::keyPressEvent(event);
-
}
-
-
void MyScene::mousePressEvent(QGraphicsSceneMouseEvent *event)
-
{
-
qDebug("*********MyScene::mousePressEvent***************");
-
QGraphicsScene::mousePressEvent(event);
-
}
2、QGraphicsView
-
#ifndef MYVIEW_H
-
#define MYVIEW_H
-
-
#include <QGraphicsView>
-
-
class MyView : public QGraphicsView
-
{
-
Q_OBJECT
-
public:
-
explicit MyView(QWidget *parent = 0);
-
-
protected:
-
void keyPressEvent(QKeyEvent *event);
-
void mousePressEvent(QMouseEvent *event);
-
void paintEvent(QPaintEvent * event);
-
void mouseMoveEvent(QMouseEvent *event);
-
signals:
-
-
public slots:
-
-
};
-
-
#endif // MYVIEW_H
-
#include "myview.h"
-
#include <QKeyEvent>
-
-
MyView::MyView(QWidget *parent) :
-
QGraphicsView(parent)
-
{
-
}
-
-
void MyView::keyPressEvent(QKeyEvent *event)
-
{
-
qDebug("*********MyView::keyPressEvent***************");
-
switch (event->key())
-
{
-
case Qt::Key_Left :
-
scale(1.2, 1.2);
-
break;
-
case Qt::Key_Right :
-
scale(1 / 1.2, 1 / 1.2);
-
break;
-
case Qt::Key_Up :
-
rotate(30);
-
break;
-
}
-
QGraphicsView::keyPressEvent(event);
-
}
-
-
void MyView::mousePressEvent(QMouseEvent *event)
-
{
-
qDebug("************MyView::mousePressEvent*****************");
-
QGraphicsView::mousePressEvent(event);
-
}
-
-
void MyView::paintEvent(QPaintEvent *event)
-
{
-
qDebug("************MyView::paintEvent*****************");
-
QGraphicsView::paintEvent(event);
-
}
-
-
void MyView::mouseMoveEvent(QMouseEvent *event)
-
{
-
//qDebug("************MyView::mouseMoveEvent*****************");
-
QGraphicsView::mouseMoveEvent(event);
-
}
3、QGraphicsItem
-
#ifndef MYITEM_H
-
#define MYITEM_H
-
-
#include <QGraphicsItem>
-
#include <QGraphicsSceneEvent>
-
class MyItem : public QGraphicsItem
-
{
-
public:
-
MyItem();
-
QRectF boundingRect() const;
-
void paint(QPainter *painter, const QStyleOptionGraphicsItem *option,
-
QWidget *widget);
-
void setColor(const QColor &color) { brushColor = color; }
-
-
protected:
-
void keyPressEvent(QKeyEvent *event);
-
void mousePressEvent(QGraphicsSceneMouseEvent *event);
-
void hoverEnterEvent(QGraphicsSceneHoverEvent *event);
-
void hoverLeaveEvent (QGraphicsSceneHoverEvent * event);
-
void contextMenuEvent(QGraphicsSceneContextMenuEvent *event);
-
void mouseMoveEvent(QGraphicsSceneMouseEvent *event);
-
private:
-
QColor brushColor;
-
-
};
-
-
#endif // MYITEM_H
-
#include "myitem.h"
-
#include <QPainter>
-
#include <QCursor>
-
#include <QKeyEvent>
-
#include <QGraphicsSceneHoverEvent>
-
#include <QGraphicsSceneContextMenuEvent>
-
#include <QMenu>
-
-
MyItem::MyItem()
-
{
-
brushColor = Qt::red;
-
setFlag(QGraphicsItem::ItemIsFocusable);
-
setFlag(QGraphicsItem::ItemIsMovable);
-
//setAcceptHoverEvents(true);
-
}
-
-
QRectF MyItem::boundingRect() const
-
{
-
qreal adjust = 0.5;
-
return QRectF(-10 - adjust, -10 - adjust,
-
20 + adjust, 20 + adjust);
-
}
-
-
void MyItem::paint(QPainter *painter, const QStyleOptionGraphicsItem *option,
-
QWidget *widget)
-
{ qDebug("************MyItem::paint*****************");
-
if(hasFocus()) {
-
painter->setPen(QPen(QColor(255,255,255,200)));
-
} else {
-
painter->setPen(QPen(QColor(100,100,100,100)));
-
}
-
painter->setBrush(brushColor);
-
painter->drawRect(-10, -10, 20, 20);
-
}
-
-
// 鼠标按下事件处理函数,设置被点击的图形项获得焦点,并改变光标外观
-
void MyItem::mousePressEvent(QGraphicsSceneMouseEvent *event)
-
{
-
qDebug("************MyItem::mousePressEvent*****************");
-
setFocus();
-
setCursor(Qt::ClosedHandCursor);
-
}
-
-
// 键盘按下事件处理函数,判断是否是向下方向键,如果是,则向下移动图形项
-
void MyItem::keyPressEvent(QKeyEvent *event)
-
{
-
qDebug("************MyItem::keyPressEvent*****************");
-
if(event->key() == Qt::Key_Down)
-
moveBy(0, 10);
-
}
-
-
// 悬停事件处理函数,设置光标外观和提示
-
void MyItem::hoverEnterEvent(QGraphicsSceneHoverEvent *event)
-
{
-
qDebug("************MyItem::hoverEnterEvent*****************");
-
setCursor(Qt::OpenHandCursor);
-
setToolTip("I am item");
-
}
-
-
void MyItem::hoverLeaveEvent(QGraphicsSceneHoverEvent *event)
-
{
-
qDebug("************MyItem::hoverLeaveEvent*****************");
-
setCursor(Qt::ArrowCursor);
-
}
-
-
-
// 右键菜单事件处理函数,为图形项添加一个右键菜单
-
void MyItem::contextMenuEvent(QGraphicsSceneContextMenuEvent *event)
-
{
-
QMenu menu;
-
QAction *moveAction = menu.addAction("move back");
-
QAction *actAction = menu.addAction("test");
-
QAction *selectedAction = menu.exec(event->screenPos());
-
if(selectedAction == moveAction) {
-
setPos(0, 0);
-
}
-
}
-
-
void MyItem::mouseMoveEvent(QGraphicsSceneMouseEvent *event)
-
{
-
qDebug("************MyItem::mouseMoveEvent*****************");
-
QGraphicsItem::mouseMoveEvent(event);
-
}
4、main及运行
-
#include <QApplication>
-
#include "myitem.h"
-
#include "myview.h"
-
#include "myscene.h"
-
#include <QTime>
-
-
int main(int argc,char* argv[ ])
-
{
-
QApplication app(argc,argv);
-
-
qsrand(QTime(0, 0, 0).secsTo(QTime::currentTime()));
-
-
MyScene scene;
-
scene.setSceneRect(-200, -150, 400, 300);
-
for(int i = 0; i < 5; ++i) {
-
MyItem *item = new MyItem;
-
item->setColor(QColor(qrand() % 256, qrand() % 256, qrand() % 256));
-
item->setPos(i * 50 - 90, -50);
-
scene.addItem(item);
-
}
-
-
-
MyView view;
-
view.setScene(&scene);
-
view.setBackgroundBrush(QPixmap(":/background.png"));
-
view.show();
-
-
return app.exec();
-
}