Qt工作笔记-QGraphics框架中,给图像中的点连线【获取场景中的数据】【有坑】

程序运行截图如下:



这里面有一个坑,就是获取场景中的元素并不是根据图像中,从左往右,从上往下这样的获取。

而是根据加入常见的先后,进行的,

如下图:



Line是在Ellipse前加载的,所以是这样的结构进行展示的。

官方并没有很详细的说明


但根据Qt::ItemSelectionMode这个参数可以知道


源码如下:

widget.h

#ifndef WIDGET_H
#define WIDGET_H

#include <QWidget>
class QGraphicsScene;
class QGraphicsLineItem;
class QGraphicsEllipseItem;
class QGraphicsItem;

namespace Ui {
class Widget;
}

class Widget : public QWidget
{
    Q_OBJECT

public:
    explicit Widget(QWidget *parent = 0);
    ~Widget();

    void btnClicked();
    void connectDot(const QGraphicsLineItem *startLine
                    , const QGraphicsLineItem *endLine
                    , QList<QGraphicsItem *> &dotVec);

private:
    Ui::Widget *ui;

    QGraphicsScene *m_scene;
};

#endif // WIDGET_H


widget.cpp

#include "widget.h"
#include <QApplication>

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    Widget w;
    w.show();

    return a.exec();
}

main.cpp

#include "widget.h"
#include "ui_widget.h"

#include <QGraphicsScene>
#include <QGraphicsLineItem>
#include <QGraphicsEllipseItem>
#include <QGraphicsItem>
#include <QDebug>
#include <QList>

Widget::Widget(QWidget *parent) :
    QWidget(parent),
    ui(new Ui::Widget)
{
    ui->setupUi(this);

    m_scene=new QGraphicsScene;
    m_scene->setSceneRect(0,0,this->width(),this->height());

    QGraphicsLineItem *lineItemStart=new QGraphicsLineItem;
    lineItemStart->setLine(0,0,700,0);
    lineItemStart->setPen(QPen(Qt::black,5));
    m_scene->addItem(lineItemStart);

    QGraphicsLineItem *lineItemEnd=new QGraphicsLineItem;
    lineItemEnd->setLine(0,480,700,480);
    lineItemEnd->setPen(QPen(Qt::black,5));
    m_scene->addItem(lineItemEnd);

    for(int i=0;i<10;i++){
        QGraphicsEllipseItem *ellipse=new QGraphicsEllipseItem;
        ellipse->setRect(100,(i+1)*40,16,16);
        m_scene->addItem(ellipse);

    }


    for(int i=0;i<10;i++){
        QGraphicsEllipseItem *ellipse=new QGraphicsEllipseItem;
        ellipse->setRect(300,(i+1)*45,16,16);
        m_scene->addItem(ellipse);

    }

    ui->graphicsView->setScene(m_scene);

    connect(ui->pushButton,&QPushButton::clicked,this,&Widget::btnClicked);
}

Widget::~Widget()
{
    delete ui;
}

void Widget::btnClicked()
{
    //第一竖排的点
    QList<QGraphicsItem*> graphicsSet=m_scene->items(0,0,150,500,Qt::IntersectsItemBoundingRect,Qt::AscendingOrder);

    //这个东西会后来居上
    QGraphicsLineItem *startLine=(QGraphicsLineItem*)graphicsSet[0];
    QGraphicsLineItem *endLine=(QGraphicsLineItem*)graphicsSet[1];
    graphicsSet.removeAt(0);
    graphicsSet.removeAt(0);

    connectDot(startLine,endLine,graphicsSet);

    //第二竖排的点
    graphicsSet.clear();
    graphicsSet=m_scene->items(150,0,400,500,Qt::IntersectsItemBoundingRect,Qt::AscendingOrder);
    startLine=(QGraphicsLineItem*)graphicsSet[0];
    endLine=(QGraphicsLineItem*)graphicsSet[1];
    graphicsSet.removeAt(0);
    graphicsSet.removeAt(0);

    connectDot(startLine,endLine,graphicsSet);
}

void Widget::connectDot(const QGraphicsLineItem *startLine
                        , const QGraphicsLineItem *endLine
                        , QList<QGraphicsItem*> &dotVec)
{
    //两条线和圆点的
    QGraphicsLineItem *itemStart=new QGraphicsLineItem;
    itemStart->setLine(((QGraphicsEllipseItem*)dotVec[0])->rect().x()+8,
            startLine->line().y1(),
            ((QGraphicsEllipseItem*)dotVec[0])->rect().x()+8,
            ((QGraphicsEllipseItem*)dotVec[0])->rect().y());
    m_scene->addItem(itemStart);


    QGraphicsLineItem *itemEnd=new QGraphicsLineItem;
    itemEnd->setLine(((QGraphicsEllipseItem*)dotVec[dotVec.size()-1])->rect().x()+8,
            endLine->line().y1(),
            ((QGraphicsEllipseItem*)dotVec[dotVec.size()-1])->rect().x()+8,
            ((QGraphicsEllipseItem*)dotVec[dotVec.size()-1])->rect().y()+16);
    m_scene->addItem(itemEnd);

    //画点和点的连线
    for(int i=1;i<dotVec.size();i++){    //3个点里面只要画2条线,10个点9条线
        int posXStart=static_cast<QGraphicsEllipseItem*>(dotVec[i-1])->rect().x();
        int posYStart=static_cast<QGraphicsEllipseItem*>(dotVec[i-1])->rect().y();

        int posXEnd=static_cast<QGraphicsEllipseItem*>(dotVec[i])->rect().x();
        int posYEnd=static_cast<QGraphicsEllipseItem*>(dotVec[i])->rect().y();

        QGraphicsLineItem *item=new QGraphicsLineItem;
        item->setLine(posXStart+8,posYStart+16,posXEnd+8,posYEnd);
        m_scene->addItem(item);
    }
}

猜你喜欢

转载自blog.csdn.net/qq78442761/article/details/80915087