请问 Qt 如何实现鼠绘点、线、圆、多边形等图元和文字标注?有没有学习资料推荐?

我最近在用 Qt 尝试做一款医疗影像的软件,里面需要实现用鼠标绘制 点、线、圆、多边形等。想问下像这种需求是用 QWidget 重载鼠标的event事件后用 QPainter 来实现,还是使用 QGraphicsView/ QGraphicsSence/ QGraphicsItem 三件套来实现更好些?大致要实现的效果如下图(主要是想实现鼠绘图元和文字标注部分,人体骨骼这个底图不用管,它是从外部导入的图像)。请问有没有推荐的 Qt 鼠绘图形的参考资料或学习视频?

img

b站找一个视频学学

这种东西还要学吗,会c++,知道一点qt的基本知识,直接写就行了,有问题的地方一个搜索就解决了。

  • 这篇博客: 二十五、Qt之自定义图形视图组件,扩展基础 Widget 功能,以 QGraphicsView 组件为例中的 一、使用场景 部分也许能够解决你的问题, 你可以仔细阅读以下内容或跳转源博客中阅读:
  • QGraphicsView 是 Qt 的图形视图组件,在 UI 设计器的 Display Widget 分组里可以拖放一个 QGraphicsView 组件到窗口上。但遇到下面的场景时:当鼠标在 QGraphicsView 上移动时就显示当前光标的坐标,这涉及到 mouseMoveEvent() 事件的处理。但是 QGraphicsView 并没有与 mouseMoveEvent() 相关的信号,因而无法定义槽函数与此事件相关联。
    为此,从 QGraphicsView 继承定义一个类 QwGraphicsView,实现 mouseMoveEvent() 事件和 mousePressEvent() 事件,并把鼠标事件转换为信号,这样就可以在主程序里设计槽函数响应这些鼠标事件。

  • 以下回答由chatgpt基于相关博客总结生成:

    根据参考资料和你的问题,可以采用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 以及一些在线教程和视频教程。