由于我的长期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();
}
提前感谢您的阅读和回复。
答案 0 :(得分: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();
}
答案 1 :(得分: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()添加到场景中的椭圆(为了通过更改参数来查看不同的结果),所以我需要创建一个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");
}