C++ 从QGraphicsView上的数据文件中绘制点

C++ 从QGraphicsView上的数据文件中绘制点,c++,qt,C++,Qt,由于我的QT长期项目进展顺利,我试图解决我的实际步骤,但我认为它不起作用,因此我有一个问题: 从QGraphicsView上的数据文件中绘制点 我的代码实际上是在过程结束时编写一个数据文件,其中第一行是元素的数量(向量的大小),其他行是点的值,x和y之间用空格分隔 res.dat 250 12 23 30 40 25 67 ... 我想阅读这个文件(使用fstream)并在QGraphicsView上显示向量的每个点,以便得到一个图形结果,理想情况下,但不是最重要的结果,将这个点放置在所需的形

由于我的QT长期项目进展顺利,我试图解决我的实际步骤,但我认为它不起作用,因此我有一个问题:

从QGraphicsView上的数据文件中绘制点

我的代码实际上是在过程结束时编写一个数据文件,其中第一行是元素的数量(向量的大小),其他行是点的值,x和y之间用空格分隔

res.dat

250
12 23
30 40
25 67
...
我想阅读这个文件(使用fstream)并在QGraphicsView上显示向量的每个点,以便得到一个图形结果,理想情况下,但不是最重要的结果,将这个点放置在所需的形式上

我已经在一个主源文件上尝试了这部分代码来进行测试,但它只是做了一个循环,我认为它没有读取我的文件

main.cpp

#include <QGraphicsView>
#include <QGraphicsScene>
#include <QPointF>
#include <QVector>
#include <QApplication>
#include <fstream>

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    int n;
    std::ifstream ifs1("res.dat");
    ifs1 >> n;
    QVector <QPointF> points(n);

    // Create a view, put a scene in it and add tiny circles
    // in the scene
    QGraphicsView * view = new QGraphicsView();
    QGraphicsScene * scene = new QGraphicsScene();

    view->setScene(scene);
    for(int i = 1; i< n; i++)
        scene->addEllipse(points[i].x(), points[i].y(), 512, 512);

    // Show the view
    view->show();

    return a.exec();
}
#包括
#包括
#包括
#包括
#包括
#包括
int main(int argc,char*argv[])
{
质量保证申请a(argc、argv);
int n;
标准::ifstream ifs1(“res.dat”);
ifs1>>n;
矢量点(n);
//创建一个视图,在其中放置一个场景并添加小圆圈
//现场
QGraphicsView*视图=新的QGraphicsView();
qgraphicscene*场景=新的qgraphicscene();
查看->设置场景(场景);
对于(int i=1;i加法器(点[i].x(),点[i].y(),512);
//显示视图
查看->显示();
返回a.exec();
}

提前感谢您的阅读和回复。

从您的代码中,完全没有读取点的实际坐标的部分。 我稍微修改了你的代码,将点读入向量,但请记住:

a) 这段代码几乎是“可靠的”,例如,如果您的res.dat文件格式有点不正确,它就会崩溃

b) 有了这个循环,您真的不需要知道文件中有多少点,现在它会一直读取,直到文件结束

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    int n;
    std::ifstream ifs1("res.dat");
    ifs1 >> n;
    QVector <QPointF> points;
    qreal px,py;
    while (ifs1 >> px) {
        ifs1 >> py;
        points.append(QPointF(px,py));
    }
    // Create a view, put a scene in it and add tiny circles
    // in the scene
    QGraphicsView * view = new QGraphicsView();
    QGraphicsScene * scene = new QGraphicsScene();

    view->setScene(scene);
    foreach (QPointF point, points)
        scene->addEllipse(point.x(), point.y(), 51, 51);


    // Show the view
    view->show();

    return a.exec();
}
intmain(intargc,char*argv[])
{
质量保证申请a(argc、argv);
int n;
标准::ifstream ifs1(“res.dat”);
ifs1>>n;
矢量点;
qreal-px,py;
而(如果s1>>px){
ifs1>>py;
附加点(QPointF(px,py));
}
//创建一个视图,在其中放置一个场景并添加小圆圈
//现场
QGraphicsView*视图=新的QGraphicsView();
qgraphicscene*场景=新的qgraphicscene();
查看->设置场景(场景);
foreach(QPointF点,点)
场景->加法器(point.x(),point.y(),51,51);
//显示视图
查看->显示();
返回a.exec();
}

从您的代码中,它完全缺少读取点的实际坐标的部分。 我稍微修改了你的代码,将点读入向量,但请记住:

a) 这段代码几乎是“可靠的”,例如,如果您的res.dat文件格式有点不正确,它就会崩溃

b) 有了这个循环,您真的不需要知道文件中有多少点,现在它会一直读取,直到文件结束

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    int n;
    std::ifstream ifs1("res.dat");
    ifs1 >> n;
    QVector <QPointF> points;
    qreal px,py;
    while (ifs1 >> px) {
        ifs1 >> py;
        points.append(QPointF(px,py));
    }
    // Create a view, put a scene in it and add tiny circles
    // in the scene
    QGraphicsView * view = new QGraphicsView();
    QGraphicsScene * scene = new QGraphicsScene();

    view->setScene(scene);
    foreach (QPointF point, points)
        scene->addEllipse(point.x(), point.y(), 51, 51);


    // Show the view
    view->show();

    return a.exec();
}
intmain(intargc,char*argv[])
{
质量保证申请a(argc、argv);
int n;
标准::ifstream ifs1(“res.dat”);
ifs1>>n;
矢量点;
qreal-px,py;
而(如果s1>>px){
ifs1>>py;
附加点(QPointF(px,py));
}
//创建一个视图,在其中放置一个场景并添加小圆圈
//现场
QGraphicsView*视图=新的QGraphicsView();
qgraphicscene*场景=新的qgraphicscene();
查看->设置场景(场景);
foreach(QPointF点,点)
场景->加法器(point.x(),point.y(),51,51);
//显示视图
查看->显示();
返回a.exec();
}

在您帮助我之后,我的代码更进一步了,我有一个不明白的问题

在头文件中

//All includes

class ProjectWindow;

class MainWindow : public QMainWindow
{
    Q_OBJECT


public:
    explicit MainWindow(QWidget *parent = 0);
    ~MainWindow();
private:
    // GraphicsView 1
    QGraphicsView view1;
    QGraphicsScene scene1;
    QGraphicsPixmapItem item1;
    QGraphicsPixmapItem item2;
    QString fileName;

    // GraphicsView 2
    QGraphicsScene scene2;
    QGraphicsView view2;
    QVector <QPointF> points;
    qreal px,py;
    QPointF point;
    QPainter painter;


    QGraphicsEllipseItem *ellipse;

public slots:
    void openBrowser();
    void drawcirc();
    void drawCircle();
    void runSnakes();
    void displayResult();


};

#endif // MAINWINDOW_H
//All includes

class ProjectWindow;

class MainWindow : public QMainWindow
{
    Q_OBJECT


public:
    explicit MainWindow(QWidget *parent = 0);
    ~MainWindow();
private:
    // GraphicsView 1
    QGraphicsView view1;
    QGraphicsScene scene1;
    QGraphicsPixmapItem item1;
    QGraphicsPixmapItem item2;
    QString fileName;

    // GraphicsView 2
    QGraphicsScene scene2;
    QGraphicsView view2;
    QVector <QPointF> points;
    qreal px,py;
    QPointF point;
    QPainter painter;


    QGraphicsEllipseItem ellipse; // The only line changed

public slots:
    void openBrowser();
    void drawcirc();
    void drawCircle();
    void runSnakes();
    void displayResult();


};

#endif // MAINWINDOW_H
//全部包含
类项目窗口;
类主窗口:公共QMainWindow
{
Q_对象
公众:
显式主窗口(QWidget*parent=0);
~main窗口();
私人:
//图形视图1
QGraphicsView视图1;
QsCENE场景1;
QX资本项目1;
QX资本项目2;
QString文件名;
//图形视图2
QsCENE场景2;
QGraphicsView视图2;
矢量点;
qreal-px,py;
QPointF点;
油漆工;
QGraphicsEllipseItem*椭圆;
公众时段:
void openBrowser();
void drawcirc();
void drawCircle();
void runSnakes();
void displayResult();
};
#endif//main窗口
在.cpp文件中

void MainWindow::displayResult()
{

    scene2.removeItem(&item2); //removing a picture
    scene2.addItem(&item2);  // adding a picture
    scene2.setSceneRect(scene2.itemsBoundingRect());
    // Reading res.dat file and plot the contour
    int m;
    std::ifstream ifs2("final_contour.dat");
    ifs2 >> m;
    std::cout << m;

    while (ifs2 >> px)
    {
        ifs2 >> py;
        points.append(QPointF(py,px));
    }

    foreach(point, points)

    ellipse = scene2.addEllipse(QRectF(point.y(), width-point.x(),1,1),QPen(Qt::red));


    // Saving the final contour into a picture
    QImage pixmap(width, width, QImage::Format_ARGB32_Premultiplied);
    painter.begin(&pixmap);
    painter.setRenderHint(QPainter::Antialiasing, false);
    scene2.render(&painter);
    painter.end();
    pixmap.save("finalcontour.bmp", "BMP");

}
void主窗口::displayResult()
{
场景2.removietem(&item2);//删除图片
场景2.addItem(&item2);//添加图片
scene2.setscen直立(scene2.itemsBoundingRect());
//读取res.dat文件并绘制等高线
int m;
标准::ifstream ifs2(“最终轮廓数据”);
ifs2>>m;
标准::cout>px)
{
ifs2>>py;
附加点(QPointF(py,px));
}
foreach(点,点)
椭圆=场景2.addEllipse(QRectF(point.y(),width point.x(),1,1),QPen(Qt::red));
//将最终轮廓保存到图片中
QImage pixmap(宽度,宽度,QImage::格式_ARGB32_预乘);
painter.begin(&pixmap);
painter.setRenderInt(QPainter::抗锯齿,false);
场景2.渲染和绘制;
结束();
保存(“finalcantour.bmp”、“bmp”);
}
我想用removeItem()删除我添加到场景中的椭圆(以便通过改变参数看到不同的结果),因此我需要创建一个QGraphicsSellipseitem,并告诉场景addItem(),我以后可以用removeItem()删除该项目

头文件

//All includes

class ProjectWindow;

class MainWindow : public QMainWindow
{
    Q_OBJECT


public:
    explicit MainWindow(QWidget *parent = 0);
    ~MainWindow();
private:
    // GraphicsView 1
    QGraphicsView view1;
    QGraphicsScene scene1;
    QGraphicsPixmapItem item1;
    QGraphicsPixmapItem item2;
    QString fileName;

    // GraphicsView 2
    QGraphicsScene scene2;
    QGraphicsView view2;
    QVector <QPointF> points;
    qreal px,py;
    QPointF point;
    QPainter painter;


    QGraphicsEllipseItem *ellipse;

public slots:
    void openBrowser();
    void drawcirc();
    void drawCircle();
    void runSnakes();
    void displayResult();


};

#endif // MAINWINDOW_H
//All includes

class ProjectWindow;

class MainWindow : public QMainWindow
{
    Q_OBJECT


public:
    explicit MainWindow(QWidget *parent = 0);
    ~MainWindow();
private:
    // GraphicsView 1
    QGraphicsView view1;
    QGraphicsScene scene1;
    QGraphicsPixmapItem item1;
    QGraphicsPixmapItem item2;
    QString fileName;

    // GraphicsView 2
    QGraphicsScene scene2;
    QGraphicsView view2;
    QVector <QPointF> points;
    qreal px,py;
    QPointF point;
    QPainter painter;


    QGraphicsEllipseItem ellipse; // The only line changed

public slots:
    void openBrowser();
    void drawcirc();
    void drawCircle();
    void runSnakes();
    void displayResult();


};

#endif // MAINWINDOW_H
//全部包含
类项目窗口;
类主窗口:公共QMainWindow
{
Q_对象
公众:
显式主窗口(QWidget*parent=0);
~main窗口();
私人:
//图形视图1
QGraphicsView视图1;
QsCENE场景1;
QX资本项目1;
QX资本项目2;
QString文件