思考:1.QGraphicsView、QGraphicsScene、QGraphicsItem的概念和联系 2.为什么要使用这种组合?3.如何使用? 4.怎么优化?
可以展示QGraphicsScene内容的控件。`
QGraphicsScene scene;
scene.addText("Hello, world!");
QGraphicsView view(&scene);//也可以使用setScene()
view.show();
QGraphicsScene 就像是给QGraphicsItem对象提供服务的容器。
具有以下特点:
1.快速管理大量的item对象
2.传播事件中介
3.管理item的状态,比如选中聚焦等等。
QGraphicsItem是最基本的对象,它有几种派生类:
QGraphicsEllipseItem provides an ellipse item
QGraphicsLineItem provides a line item
QGraphicsPathItem provides an arbitrary path item
QGraphicsPixmapItem provides a pixmap item
QGraphicsPolygonItem provides a polygon item
QGraphicsRectItem provides a rectangular item
QGraphicsSimpleTextItem provides a simple text label item
QGraphicsTextItem provides an advanced text browser item
也可以自定义类:
class DectorItem : public QObject,public QGraphicsItem
{
Q_OBJECT
Q_INTERFACES(QGraphicsItem)
}
1.可以用鼠标和键盘对QGraphicsItem进行交互。
2.自带旋转、平移、缩放和剪切功能。
3.打印QGraphicsScene ,生成图片
1.创建QGraphicsView的子类,重新实现鼠标和键盘按钮事件处理函数(句柄)。
2.使用映射函数mapToScene() and mapFromScene(),item访问函数items() and itemAt(),从而可以控制points, rectangles, polygons and paths的视图坐标系和场景坐标系的转换。换言之,可以通过view coordinates来获取具体的items。
DectorGraphicsView::DectorGraphicsView(QWidget *parent)
: QGraphicsView(parent)
{
this->thisInit();
this->thisSlot();
}
DectorGraphicsView::~DectorGraphicsView()
{
}
void DectorGraphicsView::thisInit() {
m_xPos = m_yPos = -1000;
this->m_scene = new QGraphicsScene(this);
this->m_scene->setItemIndexMethod(QGraphicsScene::NoIndex);//显示更快
this->setScene(this->m_scene);
this->setCacheMode(CacheBackground);//缓存背景,显示更快
this->setViewportUpdateMode(FullViewportUpdate);//全部视口更新,显示更快
this->setRenderHint(QPainter::Antialiasing);
this->setTransformationAnchor(AnchorUnderMouse);//变换的时候场景的位置
this->setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff); // 这里很重要,否则坐标对不准
this->setVerticalScrollBarPolicy(Qt::ScrollBarAlwaysOff);
this->scale(1.000000000000, 1.000000000000);
this->setAcceptDrops(true); //可拖拉
this->viewport()->setStyleSheet("background:transparent;");
this->setStyleSheet("QGraphicsView { background:rgb(18,96,151);}");
m_xLineItem = new DectorPosLineItem(LineDirectionS::XLineS);
m_yLineItem = new DectorPosLineItem(LineDirectionS::YLineS);
m_xLineItem->setZValue(1);
m_yLineItem->setZValue(1);
this->m_scene->addItem(m_xLineItem);
this->m_scene->addItem(m_yLineItem);
}