簡體   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