要理解Qt的绘画模块,核心就是理解Qt的坐标系统:
- 视口坐标、视图坐标
- 窗口坐标、场景坐标
视口坐标
视口坐标,又可以叫做物理坐标,又或者视图坐标,表示绘图设备的任意一个矩形区域的物理坐标,可以只选取物理坐标的一个矩形区域用于绘图。默认情况下,视口等于绘图设备的整个矩形区域。
窗口坐标
窗口坐标,又可以叫做逻辑坐标,又或者场景坐标,它的坐标系是以绘图设备的中心为原点,构建坐标系。
窗口坐标优点
只需要按照窗口坐标定义来绘图,而不用管实际的物理坐标范围的大小,也就是屏幕自适应。
案例:
绘图如下:代码如下:
/**
* 这里的视图就是 QGraphicsView 组件
*/
void MyMainWindow::iniGraphicsSystem()
{
//场景区域
QRectF rect(-200, -100, 400, 200);
//初始化场景
scene = new QGraphicsScene(rect);
//为视图组件设置场景
ui->graphicsView->setScene(scene);
//绘制矩形
QGraphicsRectItem* item = new QGraphicsRectItem(rect);
item->setFlags(QGraphicsItem::ItemIsSelectable | QGraphicsItem::ItemIsFocusable);
QPen pen;
pen.setWidth(2);
item->setPen(pen);
scene->addItem(item);
//绘制蓝色椭圆(圆心默认就是场景的原点)
QGraphicsEllipseItem* item2 = new QGraphicsEllipseItem(-100, -50, 200, 100);
item2->setPos(0, 0);
item2->setBrush(QBrush(Qt::blue));
item2->setFlags(QGraphicsItem::ItemIsSelectable | QGraphicsItem::ItemIsFocusable
| QGraphicsItem::ItemIsMovable);
scene->addItem(item2);
//绘制红色椭圆
item2 = new QGraphicsEllipseItem(-50, -50, 100, 100);
//设置圆心位置,覆盖默认位置
item2->setPos(rect.right(), rect.bottom());
item2->setBrush(QBrush(Qt::red));
item2->setFlags(QGraphicsItem::ItemIsSelectable | QGraphicsItem::ItemIsFocusable
| QGraphicsItem::ItemIsMovable);
scene->addItem(item2);
scene->clearSelection();
}