QThread within the same class



  • I have a QPushButton and two QLabel's. When the pushbutton is clicked, each QLabel will display over 1000 frames every 500 milliseconds or so making it appear as a video. However, each QLabel will display different frames from different directorie's locations but both QLabels need to display their frames/video at the same time. After some research, I believe I need two threads in order to run them at the same time. I have written the important sections of the code below.
    I am not sure how to use Threads here. Will each tread call the same timer or is it two separate ones? I know for sure that both threads need to call the updateLabel but I am not sure how to make this work and where to put the threads.

    #include "setup.h"
    #include "ui_setup.h"
    #include <QFile>
    #include <QTextStream>
    #include <QDir>
    #include <QTimer>
    #include <QThread>
    #include <QDebug>
    
    setup::setup(QWidget *parent) :
        QWidget(parent),
        ui(new Ui::setup)
    {
        ui->setupUi(this);
        timer = new QTimer(this);
        connect(timer, SIGNAL(timeout()), this, SLOT(updateLabel())); //not sure how this will work
        directory1 = QString("directory1_name");
        directory2= QString("directory2_name");
    }
    
    void setup::updateLabel(QString directory)
    {
      // if fileList is empty
       //  timer->stop
    
    else {
        //save images into vector
    }
    ui->label1->setPixmap(images[x]);
    ui->label1->update();
    }
    
    void setup::onClickPlay()
    {
        QDir myDir(directory1);
        filelist = myDir.entryList(QStringList("*.png")); //saves all images
        timer->start(500);
    }
    
    setup::~setup()
    {
        delete ui;
    }

  • Qt Champions 2018

    In the code you provided I cannot see any threads.
    In general there is no need for threads in this case: just use a timer and update the labels on each timer event.

    A note: in Qt you should NEVER modify UI from another threads! This is not supported.



  • @jsulm I didn't add any threads since I wasn't sure how or where to add them. But how do I updated both QLabels at the same time id threads are not necessary?


  • Qt Champions 2017

    @marlenet15
    Strictly speaking you can't unless you call QWidget::repaint() on each of the widgets manually from the same function/slot. Otherwise Qt will schedule the paint events as it sees fit, which is absolutely fine for most of the cases. Also you can't call QWidget functions from a separate thread (as @jsulm noted), it must be from the main thread. So @jsulm is absolutely correct that you don't actually need any threads and stand to gain nothing from them.

    Kind regards.



  • I guess you are right. I will work on this without the Threads. Thank you for your help!


Log in to reply