2015-07-15 2 views
1

В своей работе идут хорошо на мой длинный проект QT, я пытался решить свои реальные шаги, но я думаю, что это не работает, поэтому у меня есть один вопрос:Draw точки из файла данных на QGraphicsView

Нарисовать точки из файла данных на 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(); 
} 

Заранее спасибо за чтение, и для ответа.

+0

Вы должны создать еще одну тему для второго вопроса, простота поможет лучше понять. –

+0

Хорошо, я собираюсь изменить это. – alexandreMepage

ответ

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

Благодарим вас за ответ. Ну, я думал, что получаю значения x и y моего вектора. Когда я добавляю то, чего не хватает в моем коде, возникает сбой: «Ошибка ASSERT в QVector :: operator []:« index out the range », файл c: \ work \ build \ qt5_workdir \ w \ s \ qtbase \ include \ qtcore \ ../../ src/corelib/tools/qvector.h, строка 385 "index out the range", означает, как вы мне сказали, что мой файл res.dat не соответствует формату? Как я могу управлять этим, чтобы иметь хороший формат? – alexandreMepage

+0

Я обновил код, изменил цикл for int foreach, если он работает – Marco

+0

Да, он работает хорошо! Я посмотрю на то, чтобы понять это правильно! И теперь я вижу, что мой алгоритм в конце не очень хорош, так что это круто, я могу иметь графический результат, поскольку данные не имели большого значения в результатах. Большое спасибо. – alexandreMepage

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() (для того, чтобы увидеть результаты Differents с меняющимися параметрами), поэтому мне нужно создать 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 

СРР файл

аннулируются 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

Смежные вопросы