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

时间:2015-07-15 21:47:44

标签: c++ qt

由于我的长期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();
}

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

2 个答案:

答案 0 :(得分:0)

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

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();
}

答案 1 :(得分:0)

在你帮助我之后,我的代码进一步发展,我有一个我不明白的问题。

头文件中的

//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

在.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");

}

我想删除我用removeItem()添加到场景中的椭圆(为了通过更改参数来查看不同的结果),所以我需要创建一个QGraphicsEllipseItem并告诉场景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; // The only line changed

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


};

#endif // MAINWINDOW_H

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.setRect(QRectF(point.y(), width-point.x(),1,1));
    ellipse.setPen(QPen(Qt::red));
    scene2.addItem(&ellipse);


    // 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");

}

但是改变我想要添加椭圆的方式,它不是用我定义椭圆的第一种方式显示这样的整点:enter image description here

但只有一点,而不是点的向量,像这样:enter image description here