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();
}