繁体   English   中英

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

[英]Draw points from data file on 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();
}

预先感谢您阅读和回复。

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

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

在您帮助了我之后,我的代码进一步发展,出现了一个我不明白的问题。

在头文件中

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

}

但是改变我想要添加椭圆的方式,它并没有像我定义椭圆的第一种方式那样显示整个点: 在此处输入图片说明

但是只有一个点而不是点的向量,像这样: 在此处输入图片说明

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM