C++ 从QGraphicsView上的数据文件中绘制点
由于我的QT长期项目进展顺利,我试图解决我的实际步骤,但我认为它不起作用,因此我有一个问题: 从QGraphicsView上的数据文件中绘制点 我的代码实际上是在过程结束时编写一个数据文件,其中第一行是元素的数量(向量的大小),其他行是点的值,x和y之间用空格分隔 res.datC++ 从QGraphicsView上的数据文件中绘制点,c++,qt,C++,Qt,由于我的QT长期项目进展顺利,我试图解决我的实际步骤,但我认为它不起作用,因此我有一个问题: 从QGraphicsView上的数据文件中绘制点 我的代码实际上是在过程结束时编写一个数据文件,其中第一行是元素的数量(向量的大小),其他行是点的值,x和y之间用空格分隔 res.dat 250 12 23 30 40 25 67 ... 我想阅读这个文件(使用fstream)并在QGraphicsView上显示向量的每个点,以便得到一个图形结果,理想情况下,但不是最重要的结果,将这个点放置在所需的形
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();
}
#包括
#包括
#包括
#包括
#包括
#包括
int main(int argc,char*argv[])
{
质量保证申请a(argc、argv);
int n;
标准::ifstream ifs1(“res.dat”);
ifs1>>n;
矢量点(n);
//创建一个视图,在其中放置一个场景并添加小圆圈
//现场
QGraphicsView*视图=新的QGraphicsView();
qgraphicscene*场景=新的qgraphicscene();
查看->设置场景(场景);
对于(int i=1;i加法器(点[i].x(),点[i].y(),512);
//显示视图
查看->显示();
返回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();
}
intmain(intargc,char*argv[])
{
质量保证申请a(argc、argv);
int n;
标准::ifstream ifs1(“res.dat”);
ifs1>>n;
矢量点;
qreal-px,py;
而(如果s1>>px){
ifs1>>py;
附加点(QPointF(px,py));
}
//创建一个视图,在其中放置一个场景并添加小圆圈
//现场
QGraphicsView*视图=新的QGraphicsView();
qgraphicscene*场景=新的qgraphicscene();
查看->设置场景(场景);
foreach(QPointF点,点)
场景->加法器(point.x(),point.y(),51,51);
//显示视图
查看->显示();
返回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();
}
intmain(intargc,char*argv[])
{
质量保证申请a(argc、argv);
int n;
标准::ifstream ifs1(“res.dat”);
ifs1>>n;
矢量点;
qreal-px,py;
而(如果s1>>px){
ifs1>>py;
附加点(QPointF(px,py));
}
//创建一个视图,在其中放置一个场景并添加小圆圈
//现场
QGraphicsView*视图=新的QGraphicsView();
qgraphicscene*场景=新的qgraphicscene();
查看->设置场景(场景);
foreach(QPointF点,点)
场景->加法器(point.x(),point.y(),51,51);
//显示视图
查看->显示();
返回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
//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
//全部包含
类项目窗口;
类主窗口:公共QMainWindow
{
Q_对象
公众:
显式主窗口(QWidget*parent=0);
~main窗口();
私人:
//图形视图1
QGraphicsView视图1;
QsCENE场景1;
QX资本项目1;
QX资本项目2;
QString文件名;
//图形视图2
QsCENE场景2;
QGraphicsView视图2;
矢量点;
qreal-px,py;
QPointF点;
油漆工;
QGraphicsEllipseItem*椭圆;
公众时段:
void openBrowser();
void drawcirc();
void drawCircle();
void runSnakes();
void displayResult();
};
#endif//main窗口
在.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");
}
void主窗口::displayResult()
{
场景2.removietem(&item2);//删除图片
场景2.addItem(&item2);//添加图片
scene2.setscen直立(scene2.itemsBoundingRect());
//读取res.dat文件并绘制等高线
int m;
标准::ifstream ifs2(“最终轮廓数据”);
ifs2>>m;
标准::cout>px)
{
ifs2>>py;
附加点(QPointF(py,px));
}
foreach(点,点)
椭圆=场景2.addEllipse(QRectF(point.y(),width point.x(),1,1),QPen(Qt::red));
//将最终轮廓保存到图片中
QImage pixmap(宽度,宽度,QImage::格式_ARGB32_预乘);
painter.begin(&pixmap);
painter.setRenderInt(QPainter::抗锯齿,false);
场景2.渲染和绘制;
结束();
保存(“finalcantour.bmp”、“bmp”);
}
我想用removeItem()删除我添加到场景中的椭圆(以便通过改变参数看到不同的结果),因此我需要创建一个QGraphicsSellipseitem,并告诉场景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;
public slots:
void openBrowser();
void drawcirc();
void drawCircle();
void runSnakes();
void displayResult();
};
#endif // MAINWINDOW_H
//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
//全部包含
类项目窗口;
类主窗口:公共QMainWindow
{
Q_对象
公众:
显式主窗口(QWidget*parent=0);
~main窗口();
私人:
//图形视图1
QGraphicsView视图1;
QsCENE场景1;
QX资本项目1;
QX资本项目2;
QString文件