程序运行截图如下:
这里面有一个坑,就是获取场景中的元素并不是根据图像中,从左往右,从上往下这样的获取。
而是根据加入常见的先后,进行的,
如下图:
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);
}
}