Important: Please read the Qt Code of Conduct - https://forum.qt.io/topic/113070/qt-code-of-conduct

[Solved]Put data from .txt file in QPainter



  • I am very new at Qt and am trying to make drawings with coordinates from different .txt files. The code below is what i could derive from the Qt documentation, however i think it only loads a file, i dont know how to get the values from the file to use in my painting. The files always have 2 colums, with x coordinates in the first colomn and y coordinates in the second.
    @static void process_line(const QByteArray &)
    {
    }

    static void process_line(const QString &)
    {
    }
    int main(){
    QFile file("a18.txt");

    if (!file.open(QIODevice::ReadOnly | QIODevice::Text))
    return 0;

    QTextStream in(&file);
    QString line = in.readLine();
    while (!line.isNull()) {
    process_line(line);
    line = in.readLine();

    }
    }@


  • Moderators

    assuming your coordinates are separated with "|" character (analog for spcae-character for example).
    @
    process_line(const QString & line)
    {
    QStringList coordinates = line.split("|", QString::SkipEmptyParts );
    if( coordinates.count() == 2 )
    {
    bool checkX;
    int x = coordinates.at(0).trimmed().toInt( &checkX );
    bool checkY;
    int y = coordinates.at(1).trimmed().toInt( &checkY );

      if( checkX && checkY )
             //do something with QPoint(x,y)
    

    }
    @



  • This is what i have now, but it does not give any output.. what am i doing wrong? I put your code in where i thought would fit..
    @#include "dewidget.h"

    DeWidget::DeWidget(QWidget *parent)
    : QWidget( parent)
    {

    }

    DeWidget::~DeWidget()
    {
    }

    QSize DeWidget::sizeHint() const
    {
    return QSize(840, 480);
    }

    void DeWidget::paintEvent(QPaintEvent *)
    {
    QStringList coordinates = line.split("|", QString::SkipEmptyParts );
    if( coordinates.count() == 2 )
    {
    bool checkX;
    float x = coordinates.at(0).trimmed().toFloat( &checkX );
    bool checkY;
    float y = coordinates.at(1).trimmed().toFloat( &checkY );

          if( checkX && checkY );
          setAttribute(Qt::WA_OpaquePaintEvent);
          QPainter painter(this);
          QPen linepen(Qt::red);
          linepen.setCapStyle(Qt::RoundCap);
          linepen.setWidth(10);
          painter.setRenderHint(QPainter::Antialiasing,true);
          painter.setPen(linepen);
          polyPoints << QPoint(x,y );
          painter.drawPolygon(polyPoints);
                
    }
    

    }
    static void process_line(const QByteArray &)
    {
    }

    static void process_line(const QString &)
    {
    }
    int main(){
    QFile file("a18.txt");

    if (!file.open(QIODevice::ReadOnly | QIODevice::Text))
    return 0;

    QTextStream in(&file);
    QString line = in.readLine();
    while (!line.isNull()) {
    process_line(line);
    line = in.readLine();

    }
    

    }

    @


  • Moderators

    i doubt that this code does even compile :)

    try this approach:
    @
    DeWidget::DeWidget(QWidget *parent)
    : QWidget( parent)
    {
    //read file for drawing
    QFile file("a18.txt");

    if (!file.open(QIODevice::ReadOnly | QIODevice::Text))
    {
    QTextStream in(&file);
    QString line = in.readLine();
    while (!line.isNull())
    {
    QStringList coordinates = line.split("|", QString::SkipEmptyParts );
    if( coordinates.count() == 2 )
    {
    bool checkX;
    float x = coordinates.at(0).trimmed().toFloat( &checkX );
    bool checkY;
    float y = coordinates.at(1).trimmed().toFloat( &checkY );

          if( checkX && checkY )
                polyPoints  << QPoint(x,y);    //polyPoints needs to be of type QPolygon/QPolygonF
    }
    
      line = in.readLine(); 
    }
    
    file.close();
    

    }
    this->update();
    }

    DeWidget::~DeWidget()
    {
    }

    QSize DeWidget::sizeHint() const
    {
    return QSize(840, 480);
    }

    void DeWidget::paintEvent(QPaintEvent * event)
    {
    QWidget::paintEvent(event);

          QPainter painter(this);
                 painter.setRenderHint(QPainter::Antialiasing,true);
          QPen linepen(Qt::red);
                 linepen.setCapStyle(Qt::RoundCap);
                 linepen.setWidth(10);
          painter.setPen(linepen);
    
          painter.drawPolygon(polyPoints);
    

    }
    int main()
    {
    QApplication a;
    DeWidget w;
    w.show();
    return a.exec();
    }
    @



  • It still doesnt give an output. the a18.txt file i stored it in my Other Files.. could there be the error ? :$
    Thank you for your effort!


  • Moderators

    most probably.
    Right now your code "looks ":http://qt-project.org/doc/qt-4.8/qfile.html#setFileName in the current working directory for the file to be present. Which is probably where your application binary is located.


Log in to reply