欢迎小伙伴的点评✨✨,相互学习、互关必回、全天在线🍳🍳🍳
博主🧑🧑 本着开源的精神交流Qt开发的经验、将持续更新续章,为社区贡献博主自身的开源精神👩🚀
`本章节会给大家带来Graphics View 框架结构的主要特点、 三元素及坐标系统、图元创建。
Graphics View 框架结构的主要特点如下 。
(1) 在 Graphics View 框架结构中,系统可以利用 Qt 绘图系统的反锯齿、 OpenGL 工具来改
善绘图性能。
(2) Graphics View 支持事件传播体系结构,可以使图元在场景 (scene) 中的交互能力提高
1 倍,图元能够处理键盘事件和鼠标事件 。 其中,鼠标事件包括鼠标被按下、移动、释放和双击,
还可以跟踪鼠标的移动。
(3) 在 Graphics View 框架中,通过 二元空间划分树 (Binary Space Partitioning, BSP) 提供
快速的图元查找,这样就能够实时地显示包含上百万个距元的大场景。
Graphics View 框架结构主要包含 三 个类,即场景 类 (QGraphicsScene) 、视图类CQGraphicsView) 和图元类 (QGraphicsltem), 统称为“ 三元素” 。 其中,场景类提供了 一个用于管理位于其中的众多图元容器,视图类用于显示场景中的图元, 一个场景可以通过多个视图表现, 一个场景包括多个几何图形。
Graphics View 坐标基于笛卡儿坐标系,一个图元的场景具有 x 坐标和 y 坐标。当使用没有
变换的视图观察场景时,场景中的一个单元对应屏幕上的一个像素。
三个 Graphics View 基本类有各自不同的坐标系,场景坐标、视图坐标和图元坐标。 GraphicsView 提供了三个坐标系统之间的转换函数。在绘制图形时, GraphicsView 的场景坐标对应QPainter 的逻辑坐标、视图坐标和设备标。
图一
#ifndef MAINWINDOW_H
#define MAINWINDOW_H
#include
#include
#include
#include
#include
class MainWindow : public QMainWindow
{
Q_OBJECT
public:
MainWindow(QWidget *parent = 0);
~MainWindow();
void initScene(); //初始化场景
void createActions(); //创建主窗体的所有动作
void createMenus(); //创建主窗体的菜单栏
public slots:
void slotNew(); //新建一个显示窗体
void slotClear (); //清除场景中所有的图元
void slotAddEllipseItem(); //在场景中加入一个椭圆形图元
void slotAddPolygonItem (); //在场景中加入一个多边形图元
void slotAddTextItem(); //在场景中加入一个文字图元
void slotAddRectItem (); //在场景中加入一个长方形图元
void slotAddAlphaItem(); //在场景中加入一个透明蝴蝶图片
private:
QGraphicsScene *scene;
QAction *newAct;
QAction *clearAct;
QAction *exitAct;
QAction *addEllipseItemAct;
QAction *addPolygonItemAct;
QAction *addTextItemAct;
QAction *addRectItemAct;
QAction *addAlphaItemAct;
};
#endif // MAINWINDOW_H
#include "mainwindow.h"
#include
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
MainWindow w;
w.show();
return a.exec();
}
#include "mainwindow.h"
MainWindow::MainWindow(QWidget *parent)
: QMainWindow(parent)
{
createActions(); //创建主窗体的所有动作
createMenus(); //创建主窗体的菜单栏
scene = new QGraphicsScene;
scene->setSceneRect(-200,-200,400,400);
initScene (); //初始化场景
QGraphicsView *view= new QGraphicsView;
view->setScene(scene);
view->setMinimumSize(400,400);
view->show () ;
setCentralWidget(view);
resize(550,450);
setWindowTitle(tr("Graphics Items"));
}
MainWindow::~MainWindow()
{
}
void MainWindow::createActions() //创建主窗体的所有动作
{
newAct = new QAction(tr(" 新建 "),this);
clearAct = new QAction(tr(" 清除") , this) ;
exitAct = new QAction(tr(" 退出 "),this);
addEllipseItemAct = new QAction(tr("加入椭圆 "),this);
addPolygonItemAct = new QAction(tr("加入多边形 "),this);
addTextItemAct = new QAction(tr("加入文字 "),this);
addRectItemAct = new QAction(tr("加入长方形 "),this);
addAlphaItemAct= new QAction(tr("加入透明图片 "),this);
connect (newAct, SIGNAL (triggered()), this, SLOT (slotNew ()));
connect(clearAct,SIGNAL (triggered()), this, SLOT (slotClear ()));
connect (exitAct, SIGNAL (triggered()), this, SLOT (close()));
connect (addEllipseItemAct,SIGNAL(triggered()), this, SLOT(slotAddEllipseItem ()));
connect (addPolygonItemAct,SIGNAL(triggered()), this, SLOT(slotAddPolygonItem ())) ;
connect(addTextItemAct,SIGNAL(triggered()),this,SLOT(slotAddTextItem ())) ;
connect(addRectItemAct,SIGNAL(triggered()),this,SLOT(slotAddRectItem ()));
connect(addAlphaItemAct,SIGNAL(triggered()),this,SLOT(slotAddAlphaItem()));
}
void MainWindow::createMenus() //创建主窗体的菜单栏
{
QMenu *fileMenu = menuBar () ->addMenu (tr(" 文件")) ;
fileMenu->addAction(newAct);
fileMenu->addAction(clearAct);
fileMenu->addSeparator();
fileMenu->addAction(exitAct);
QMenu *itemsMenu = menuBar()->addMenu(tr(" 元素")) ;
itemsMenu->addAction(addEllipseItemAct);
itemsMenu->addAction(addPolygonItemAct);
itemsMenu->addAction(addTextItemAct);
itemsMenu->addAction(addRectItemAct);
itemsMenu->addAction(addAlphaItemAct);
}
void MainWindow:: initScene () //初始化场景
{
int i;
for(i=0;i<3;i++)
slotAddEllipseItem ();
for(i=0;i<3;i++)
slotAddPolygonItem();
for(i=0;i<3;i++)
slotAddTextItem () ;
for(i=0;i<3;i++)
slotAddRectItem();
for(i=0;i<3;i++)
slotAddAlphaItem();
}
void MainWindow::slotNew() //新建一个显示窗体
{
slotClear();
initScene();
MainWindow *newWin = new MainWindow;
newWin->show ();
}
void MainWindow::slotClear() //清除场景中所有的图元
{
QList<QGraphicsItem*>listItem = scene->items();
while (!listItem.empty())
{
scene->removeItem(listItem.at (0));
listItem.removeAt(0);
}
}
void MainWindow::slotAddEllipseItem() //在场景中加入一个椭圆形图元
{
QGraphicsEllipseItem *item= new QGraphicsEllipseItem(QRectF(0,0,80,60));
item->setPen (Qt::NoPen);
item->setBrush(QColor(qrand() %256,qrand() %256,qrand() %256));
item->setFlag(QGraphicsItem::ItemIsMovable);
scene->addItem(item);
item->setPos((qrand() %int (scene->sceneRect () . width())) -200,
(qrand () %int (scene->sceneRect () . height ())) -200);
}
void MainWindow::slotAddPolygonItem() //在场景中加入一个多边形图元
{
QVector<QPoint> v;
v<<QPoint(30,-15)<<QPoint(0,-30)<<QPoint(-30,-15)
<<QPoint(-30,15)<<QPoint(0,30)<<QPoint(30,15);
QGraphicsPolygonItem *item= new QGraphicsPolygonItem(QPolygonF(v));
item->setBrush (QColor(qrand()%256, qrand () %256, qrand ()%256));
item->setFlag(QGraphicsItem::ItemIsMovable);
scene->addItem(item);
item->setPos((qrand()%int (scene->sceneRect ().width()))-200,
(qrand() %int (scene->sceneRect().height())) -200);
}
void MainWindow::slotAddTextItem() //在场景中加入一个文字图元
{
QFont font("Times",16);
QGraphicsTextItem *item= new QGraphicsTextItem("Hello Qt");
item->setFont(font);
item->setFlag(QGraphicsItem::ItemIsMovable);
item->setDefaultTextColor(QColor(qrand()%256, qrand()%256, qrand ()%256));
scene->addItem(item);
item->setPos((qrand()%int (scene->sceneRect().width())) -200,
(qrand()%int(scene->sceneRect() .height ()))-200);
}
void MainWindow::slotAddRectItem() //在场景中加入一个长方形图元
{
QGraphicsRectItem *item= new QGraphicsRectItem(QRectF(0,0, 60,60));
QPen pen;
pen.setWidth(3);
pen. setColor(QColor(qrand()%256, qrand ()%256, qrand()%256));
item->setPen(pen);
item->setBrush (QColor (qrand()%256, qrand()%256, qrand()%256));
item->setFlag(QGraphicsItem::ItemIsMovable);
scene->addItem(item);
item->setPos ((qrand()%int (scene->sceneRect ().width())) -200,
(qrand()%int (scene->sceneRect ().height())) -200);
}
void MainWindow::slotAddAlphaItem() //在场景中加入一个皮卡丘图片
{
QGraphicsPixmapItem *item=scene->addPixmap(QPixmap(":/src/piKa.png"));
item->setFlag(QGraphicsItem::ItemIsMovable);
item->setPos ((qrand ()%int (scene->sceneRect ().width())) -200,
(qrand() %int (scene->sceneRect () . height())) -200) ;
}
图元创建会在应用程序开发中经常用到的