我最近在用 Qt 尝试做一款医疗影像的软件,里面需要实现用鼠标绘制 点、线、圆、多边形等。想问下像这种需求是用 QWidget 重载鼠标的event事件后用 QPainter 来实现,还是使用 QGraphicsView/ QGraphicsSence/ QGraphicsItem 三件套来实现更好些?大致要实现的效果如下图(主要是想实现鼠绘图元和文字标注部分,人体骨骼这个底图不用管,它是从外部导入的图像)。请问有没有推荐的 Qt 鼠绘图形的参考资料或学习视频?
b站找一个视频学学
这种东西还要学吗,会c++,知道一点qt的基本知识,直接写就行了,有问题的地方一个搜索就解决了。
QGraphicsView 是 Qt 的图形视图组件,在 UI 设计器的 Display Widget 分组里可以拖放一个 QGraphicsView 组件到窗口上。但遇到下面的场景时:当鼠标在 QGraphicsView 上移动时就显示当前光标的坐标,这涉及到 mouseMoveEvent() 事件的处理。但是 QGraphicsView 并没有与 mouseMoveEvent() 相关的信号,因而无法定义槽函数与此事件相关联。
为此,从 QGraphicsView 继承定义一个类 QwGraphicsView,实现 mouseMoveEvent() 事件和 mousePressEvent() 事件,并把鼠标事件转换为信号,这样就可以在主程序里设计槽函数响应这些鼠标事件。
根据参考资料和你的问题,可以采用Qt的QGraphicsView/QGraphicsScene/QGraphicsItem类来实现绘制点、线、圆、多边形等图元和文字标注的效果。
首先,创建一个QWidget窗口作为主界面,将QGraphicsView作为子控件放置在该窗口上。使用QGraphicsView来显示场景(QGraphicsScene)中的图元。
在QWidget的构造函数中创建一个QGraphicsScene对象,并将其设置为QGraphicsView的场景。
class MainWindow : public QWidget
{
public:
MainWindow(QWidget *parent = nullptr) : QWidget(parent)
{
// 创建QGraphicsScene对象
QGraphicsScene *scene = new QGraphicsScene();
// 设置场景大小和背景颜色
scene->setSceneRect(0, 0, 800, 600);
scene->setBackgroundBrush(QColor(Qt::white));
// 创建QGraphicsView对象并设置场景
QGraphicsView *view = new QGraphicsView(this);
view->setScene(scene);
// 将QGraphicsView添加到主界面上
QVBoxLayout *layout = new QVBoxLayout(this);
layout->addWidget(view);
setLayout(layout);
}
};
接下来,创建自定义的图元类,继承自QGraphicsItem,并重载其绘制函数paint()。在paint()函数中使用QPainter来实现绘制点、线、圆、多边形等图元的逻辑。
class MyGraphicsItem : public QGraphicsItem
{
public:
MyGraphicsItem(QGraphicsItem *parent = nullptr) : QGraphicsItem(parent)
{
}
QRectF boundingRect() const override
{
return QRectF(-10, -10, 20, 20); // 返回图元的边界矩形
}
void paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget) override
{
Q_UNUSED(option);
Q_UNUSED(widget);
// 设置绘制属性,如颜色、线宽等
painter->setPen(QPen(Qt::red, 2));
// 绘制点
painter->drawPoint(QPointF(0, 0));
// 绘制线
painter->drawLine(QPointF(-10, 0), QPointF(10, 0));
// 绘制圆
painter->drawEllipse(QRectF(-10, -10, 20, 20));
// 绘制多边形
QVector<QPointF> points;
points << QPointF(-10, -10) << QPointF(-10, 10) << QPointF(10, 10) << QPointF(10, -10);
painter->drawPolygon(points);
// 绘制文字标注
painter->drawText(QRectF(-20, 20, 40, 20), Qt::AlignCenter, "Text");
}
};
在主界面的构造函数中,创建自定义图元对象,并将其添加到场景中。
class MainWindow : public QWidget
{
public:
MainWindow(QWidget *parent = nullptr) : QWidget(parent)
{
// 创建QGraphicsScene对象
QGraphicsScene *scene = new QGraphicsScene();
// 设置场景大小和背景颜色
scene->setSceneRect(0, 0, 800, 600);
scene->setBackgroundBrush(QColor(Qt::white));
// 创建QGraphicsView对象并设置场景
QGraphicsView *view = new QGraphicsView(this);
view->setScene(scene);
// 将QGraphicsView添加到主界面上
QVBoxLayout *layout = new QVBoxLayout(this);
layout->addWidget(view);
setLayout(layout);
// 创建自定义图元对象
MyGraphicsItem *item = new MyGraphicsItem();
// 将图元添加到场景中
scene->addItem(item);
}
};
以上代码实现了绘制点、线、圆、多边形等图元和文字标注的效果。
关于Qt鼠绘图形的参考资料和学习视频,可以参考Qt官方文档:https://doc.qt.io/qt-5/graphicsview.html 以及一些在线教程和视频教程。