QGraphics 简单的案例

博客介绍了QGraphics由场景、视图、图元三部分组成,并给出一个简单案例。该案例可随机产生五种不同颜色图元,具备放大、缩小、旋转等控制功能,还能控制单个图元,有向下移动、悬停提示等效果,同时给出相关代码文件。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

QGraphics 主要有三部分组成场景(QGraphicsScene)、视图(QGraphicsView)、图元(QGraphicsItem)组成:

下面是简单的一个QGraphics案例
每次随机产生五中不同的颜色的图元,+放大、-缩小、→旋转、(控制所有的图元)。控制某一个图元。↓向下移动10,悬停提示。鼠标点击光标变化。右键回到中心

代码
myitem.h

#include <QGraphicsItem>
#include <QPainter>

#include <QGraphicsSceneHoverEvent>
#include <QGraphicsSceneContextMenuEvent>
#include <QGraphicsSceneMouseEvent>
#include <QMenu>
#include <QKeyEvent>

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 contextMenuEvent(QGraphicsSceneContextMenuEvent *event);


private:
    QColor brushColor;
};

myitem.cpp

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)
{
    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)
{
    setFocus();
    setCursor(Qt::ClosedHandCursor);  //设置光标形状为握拳
}

//键盘按下
void MyItem::keyPressEvent(QKeyEvent *event)
{
    if(event->key()==Qt::Key_Down){
        moveBy(0,10);    //  向下移动10
    }
}

//悬停事件
void MyItem::hoverEnterEvent(QGraphicsSceneHoverEvent *event)
{
    setCursor(Qt::OpenHandCursor);
    setToolTip("I am item");   //提示
}

//内容菜单事件
void MyItem::contextMenuEvent(QGraphicsSceneContextMenuEvent *event)
{
    QMenu menu;
    QAction *moveAction=menu.addAction("move back");
    QAction *selectAction=menu.exec(event->screenPos());
    if(moveAction==selectAction){
        setPos(0,0);
    }
}

myview.h

#include <QGraphicsView>
#include <QKeyEvent>

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

protected:
    void keyPressEvent(QKeyEvent *event);
};

myview.cpp

MyView::MyView(QWidget *parent)
    :QGraphicsView(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:   //旋转30
        rotate(30);
        break;
    default:
        break;
    }
    QGraphicsView::keyPressEvent(event);   //不调用其他item不能用该事件
}

main.cpp

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

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    //MainWindow w;
    //w.show();
    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(QColor(155,155,155));
    view.show();
    return a.exec();
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值