[英]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.