来张程序图
主要练习类:
1-QGraphicsItem
2-QGraphicsView
3-QGraphicsScene
注意点-1:
在写view类的时候,找不到头文件,这里要在pro文件中加这2句
qtHaveModule(printsupport): QT += printsupport
qtHaveModule(opengl): QT += opengl
知识点-1:
Qt绘图三层结构:从上到下分别是:
QGraphicsView->QGraphicsScene->QGraphicsItem
知识点-2:
想要拖拽场景或者拖拽元素,只要设置一下场景的属性就可以
void View::togglePointerMode()
{
graphicsView->setDragMode(selectModeButton->isChecked()
? QGraphicsView::RubberBandDrag
: QGraphicsView::ScrollHandDrag);
graphicsView->setInteractive(selectModeButton->isChecked());
}
知识点-3
想要场景元素绘制时有抗锯齿效果,或者使用opengl显示,也只要设置一下场景属性就可以
void View::toggleOpenGL()
{
#ifndef QT_NO_OPENGL
graphicsView->setViewport(openGlButton->isChecked() ? new QGLWidget(QGLFormat(QGL::SampleBuffers)) : new QWidget);
#endif
}
void View::toggleAntialiasing()
{
graphicsView->setRenderHint(QPainter::Antialiasing, antialiasButton->isChecked());
}
知识点-4
放大、缩小、旋转场景,通过QMatrix修改场景属性实现
void View::setupMatrix()
{
qreal scale = qPow(qreal(2), (zoomSlider->value() - 250) / qreal(50));
QMatrix matrix;
matrix.scale(scale, scale);
matrix.rotate(rotateSlider->value());
graphicsView->setMatrix(matrix);
setResetButtonEnabled();
}
知识点-5
通过QPrinter打印场景到pdf
void View::print()
{
#if !defined(QT_NO_PRINTER) && !defined(QT_NO_PRINTDIALOG)
QPrinter printer;
QPrintDialog dialog(&printer, this);
if (dialog.exec() == QDialog::Accepted) {
QPainter painter(&printer);
graphicsView->render(&painter);
}
#endif
}
知识点-6
boundingRect和shape()是用来做碰撞检测的boundingRect一定要自己实现。
参考文档
https://blog.csdn.net/weixin_39583140/article/details/93599949
QT自定义图形项中的boundingRect()和shape()函数的理解