main.cpp
#include "myitem.h"
#include "myview.h"
#include <QApplication>
#include <QTime>
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
qsrand(QTime(0, 0, 0).secsTo(QTime::currentTime()));
QGraphicsScene 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("D:/img/333.jpeg"));
view.show();
return a.exec();
}
myitem.h
#ifndef MYITEM_H
#define MYITEM_H
#include <QGraphicsItem>
class MyItem : public QGraphicsItem
{
public:
MyItem();
~MyItem();
QRectF boundingRect() const;
void paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget);
void setColor(const QColor &color) { brush_color_ = color;}
protected:
void keyPressEvent(QKeyEvent *event);
void mousePressEvent(QGraphicsSceneMouseEvent *event);
void hoverEnterEvent(QGraphicsSceneHoverEvent *event);
void contextMenuEvent(QGraphicsSceneContextMenuEvent *event);
private:
QColor brush_color_;
};
#endif // MYITEM_H
myitem.cpp
#include "myitem.h"
#include <QPainter>
#include <QCursor>
#include <QKeyEvent >
#include <QGraphicsSceneHoverEvent>
#include <QGraphicsSceneContextMenuEvent>
#include <QMenu>
#include <QDebug>
MyItem::MyItem()
{
brush_color_ = Qt::red;
setFlag(QGraphicsItem::ItemIsFocusable);//使图形项可以获得焦点
setFlag(QGraphicsItem::ItemIsMovable);//可以使鼠标拖动图形项移动
setAcceptHoverEvents(true);//接收悬浮事件
}
MyItem::~MyItem()
{
}
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)
{
if(hasFocus()){
painter->setPen(QPen(QColor(255, 255, 255, 200)));//绘制
}else{
painter->setPen(QPen(QColor(100, 100, 100, 100)));
}
painter->setBrush(brush_color_);//填充
painter->drawRect(-10, -10, 20, 20);
}
void MyItem::keyPressEvent(QKeyEvent *event)
{
if(event->key() == Qt::Key_Down){
moveBy(0, 10);//移动图形项,相对运动
}
}
void MyItem::mousePressEvent(QGraphicsSceneMouseEvent *event)
{
setFocus();//设置焦点
setCursor(Qt::ClosedHandCursor);//改变光标外观
}
void MyItem::hoverEnterEvent(QGraphicsSceneHoverEvent *event)
{
setCursor(Qt::OpenHandCursor);
setToolTip("I am item");//设置提示
}
void MyItem::contextMenuEvent(QGraphicsSceneContextMenuEvent *event)
{
QMenu menu;
QAction *move_action = menu.addAction("move back");
QAction *selected_action = menu.exec(event->screenPos());
if(selected_action == move_action){
setPos(0, 0);//如果选中,移动到(0,0)点
}
}
myview.h
#ifndef MYVIEW_H
#define MYVIEW_H
#include <QGraphicsView>
class MyView : public QGraphicsView
{
Q_OBJECT
public:
explicit MyView(QWidget *parent = nullptr);
protected:
void keyPressEvent(QKeyEvent *event);
};
#endif // MYVIEW_H
myview.cpp
#include "myview.h"
#include <QKeyEvent>
MyView::MyView(QWidget *parent)
{
}
//实现缩放旋转,设置视图
void MyView::keyPressEvent(QKeyEvent *event)
{
switch(event->key()){
case Qt::Key_Plus:
scale(1.2,1.2);
break;
case Qt::Key_Minus:
scale(1/1.2,1/1.2);
break;
case Qt::Key_Right:
rotate(30);
break;
}
QGraphicsView::keyPressEvent(event);//进行事件的传递,否则场景或图形项无法再接受该事件
}