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

It does not create a chart



  • I have 2 different threads. In thread one reading data from txt and in thread 2 copy that file into another txt. I want to create a chart via thread 2(which is writingData() ). I have the following code. But there is no chart when i run the code. I have also mythread.h and myhread.cpp

    mainwindow.cpp

    #include "mainwindow.h"
    #include "ui_mainwindow.h"
    #include <QtCore>
    #include <QMainWindow>
    #include <QtWidgets/QMainWindow>
    #include <QtCharts>
    #include <QChart>
    
    QT_CHARTS_USE_NAMESPACE
    using namespace QtCharts;
    
    
    MainWindow::MainWindow(QWidget *parent)
        : QMainWindow(parent)
        , ui(new Ui::MainWindow)
    {
        ui->setupUi(this);
        initChartView();
        connect(m_timer, SIGNAL(timeout()), SLOT(Timer_Slot()));
        m_timer->setInterval(500);
        m_timer->start();
    
        myThreadObject = new mythread();
        myQThread = new QThread();
    
        myThreadObject->moveToThread(myQThread);
    
        connect(this, &MainWindow::startWriting, myThreadObject, &mythread::writeData);
        connect(myThreadObject, &mythread::writingDone, this, &MainWindow::writingDoneByThread);
    
        // Start the new thread
        myQThread->start();
    
    
    }
    
    void MainWindow::writingDoneByThread()
    {
    
    }
    
    MainWindow::~MainWindow()
    {
        delete ui;
    }
    
    void MainWindow::initChartView()
    {
        QChart *chart = new QChart();
        chart->ChartTypeCartesian;
        chart->addSeries(series);
        qDebug()<< series;
        QPen green(Qt::red);
        green.setWidth(2);
        series->setPen(green);
        chart->legend()->hide();
        chart->setTitle("deneme");
        chart->setAnimationOptions(QChart::AllAnimations);
    
        QValueAxis *axisX=new QValueAxis;
        axisX->setTickCount(10);
        axisX->setRange(0,5);
        axisX->applyNiceNumbers();
        chart->addAxis(axisX, Qt::AlignBottom);
        series->attachAxis(axisX);
    
        QValueAxis *axisY = new QValueAxis;
        axisY->setTickCount(10);
        axisY->setRange(0, 5);
        axisY->applyNiceNumbers();
        chart->addAxis(axisY, Qt::AlignLeft);
        series->attachAxis(axisY);
    
        QChartView *chartView = new QChartView(chart);
        chartView->setRenderHint(QPainter::Antialiasing);
        this->setCentralWidget(chartView);
    }
    
    void MainWindow::Timer_Slot()
    {
        static float q_x;
        if(!queue.isEmpty())
        {
            double num=queue.dequeue();
            q_x += 0.1;
            series->append(q_x, num);
            chart->update();
    
        }
    
    }
    

    mainwindow.h

    #ifndef MAINWINDOW_H
    #define MAINWINDOW_H
    #include "mythread.h"
    #include <QMainWindow>
    #include <QThread>
    #include <QtCharts/QChartView>
    #include <QtCharts/QLineSeries>
    #include <QtCharts/QLogValueAxis>
    #include <QtCharts/QValueAxis>
    #include <QTimer>
    
    QT_CHARTS_USE_NAMESPACE
    
    QT_BEGIN_NAMESPACE
    namespace Ui {
    class MainWindow;
    }
    QT_END_NAMESPACE
    
    class MainWindow : public QMainWindow
    {
        Q_OBJECT
    
    public:
        MainWindow(QWidget *parent = Q_NULLPTR);
        ~MainWindow();
    
        void initChartView();
        void Timer_Slot();
    private:
        Ui::MainWindow *ui;
        mythread* myThreadObject;    //mythreadden yeni bir obje yaratıyorum
        QThread* myQThread;  //QThreadden bir obje yaratıyorum
        QChart *chart = new QChart();
        QLineSeries *series = new QLineSeries();
        QQueue<double> queue;
        QTimer *m_timer = new QTimer();
    signals:
        void startWriting();
    public slots:
        void writingDoneByThread();
    
    };
    #endif // MAINWINDOW_H
    

  • Lifetime Qt Champion

    Hi,

    Your queue is empty because nothing fills it.



  • In here I thought I was adding the datas into the queue

    void mythread::writeData()
    {
    
        QFile::copy("C:/Users/ilknu/Documents/MyThread/deneme.txt", "C:/Users/ilknu/Documents/MyThread/n.txt");
        QFile file2("C:/Users/ilknu/Documents/MyThread/n.txt");
    
        qDebug() << "im working in writeData part " ;
    
        if(file2.open(QIODevice::ReadOnly))
        {
            QTextStream in(&file2);
            while(!in.atEnd())
            {
                QString line2 = in.readAll();
                QStringList list2 = line2.split(QLatin1Char(' '), Qt::SkipEmptyParts);
                for(const QString &entry : list2)
                {
                    double num = entry.toDouble();
                    queue.enqueue(num);
                    qDebug() << num;
                }
            }
        }
        file.close();
        emit writingDone();
    }
    

  • Lifetime Qt Champion

    That queue variable belongs to your mythread class. It's not the same as the one from your MainWindow class even if it has the same name.



  • @SGaist can i connect them, or what can i do for this problem? I read and write in mythread.cpp
    If i move initChartView and timer_slot, is it true?


  • Lifetime Qt Champion

    @suslucoder said in It does not create a chart:

    If i move initChartView and timer_slot, is it true?

    It won't change anything as these two variables will still be unrelated.

    @suslucoder said in It does not create a chart:

    can i connect them, or what can i do for this problem? I read and write in mythread.cpp

    You have to get the data from your mythread object back to your MainWindow.

    As I already suggested, you really should start with C++ basics before playing with threading.



  • @SGaist said in It does not create a chart:

    You have to get the data from your mythread object back to your MainWindow.

    What is the way for getting datas from mythread to my mainwindow? I would be very happy if you could show me the way


  • Lifetime Qt Champion

    Use a signal to transfer the queue. Make it a const reference.



  • @SGaist can you show me an example? I did not understand


  • Lifetime Qt Champion

    What did you not understand ?



  • @SGaist if my slot is my queue, what should be the signal. I didnt understand it.


  • Lifetime Qt Champion

    Your slot is not your queue. Did you read the chapter about signals and slots ?



  • @SGaist yes i did. But i cannot understand how can i get datas


  • Lifetime Qt Champion

    @suslucoder What exactly can't you understand? In the documentation @SGaist posted there is even an example with signal/slot with parameter...


Log in to reply