Search code examples
c++multithreadingqtqt5qt-creator

Qthreading and signal emiting from it


doit is a Qthread subclass with a signal kif() but the signal emitting is not working I want to show the resualt of gav() on one of my editLines at the same time as its changes inside gav() pls help :((((((( I wasted so much time to find out how I can do it :((((((

main.cpp

#include "mainwindow.h"

#include <QApplication>

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    MainWindow w;
    w.show();
    return a.exec();
}

doit.h

#ifndef DOIT_H
#define DOIT_H
#include <QThread>

class doit : public QThread
{
    Q_OBJECT
public:
    doit();
    int i;
    QString z;
    void run() ;
    void gav(int &i);
signals:
    void kif(const QString &text);
};

#endif // DOIT_H

#include "doit.h"

doit::doit()
{

}

void doit::run()
{
    gav(i);
}

void doit::gav(int &i) 
{
    int k=i;
    for (int b=0;b<k;b++){
        i=b;
        z= QString::number(i);
        emit kif(z);
    }
}

mainwindow.h

#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>
#include "doit.h"

QT_BEGIN_NAMESPACE
namespace Ui { class MainWindow; }
QT_END_NAMESPACE

class MainWindow : public QMainWindow
{
    Q_OBJECT

public:
    MainWindow(QWidget *parent = nullptr);
    ~MainWindow();

    doit *dovit=new doit;
private slots:
    void checkInput(const QString &text);

private:
    Ui::MainWindow *ui;
};
#endif // MAINWINDOW_H

mainwindow.cpp

#include "mainwindow.h"
#include "ui_mainwindow.h"

MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
    , ui(new Ui::MainWindow)
{
    ui->setupUi(this);
   //QObject::connect(dovit,doit::kif(&QString),this , MainWindow::checkInput(QString)))
   connect(dovit,SIGNAL(kif(QString)),this,SLOT(checkInput(QString)));
   dovit->start();
}

MainWindow::~MainWindow()
{
    delete ui;
}

void MainWindow::checkInput(const QString &text)
{
    ui->lineEdit_3->setText(text);
}

and Im new in this , so pls tell me exactlly where should I change or add and what tanx alot


Solution

  • Well it finally worked after wasting a lot of my time. For anyone wondering vtables was the problem (as I read its a bug (not sure)) and I should just

    right click on the project folder and rebuild and run qmake the project ,

    • I added Qobject.h too and it worked.

    working code:

    (it is also a simple and good example of meta signaling in qt if you need it)

    doit.h

    #define DOIT_H
    
    #include <QThread>
    #include <QObject>
    
    
    class doit : public QThread
    {
        Q_OBJECT
    public:
        doit();
    
        void gav();
        void run() ;
    signals:
    
        void kif(QString text);
    
    };
    
    #endif // DOIT_H
    

    doit.cpp

    
    #include "doit.h"
    #include <QDebug>
    
    doit::doit()
    {
    
    }
    
    void doit::run()
    {
        gav();
    }
    
    
    void doit::gav()
    {
        QString z;
        for (int i=0;i<11;i++){
            z="mamad";
            z = z + QString::number(i);
            QThread::sleep(1);
            qDebug()<<z;
            emit kif(z);
        }
    }
    
    

    mainwindow.h

    
    #ifndef MAINWINDOW_H
    #define MAINWINDOW_H
    
    #include <QMainWindow>
    #include "doit.h"
    
    
    QT_BEGIN_NAMESPACE
    namespace Ui { class MainWindow; }
    QT_END_NAMESPACE
    
    class MainWindow : public QMainWindow
    {
        Q_OBJECT
    
    public:
        MainWindow(QWidget *parent = nullptr);
        ~MainWindow();
    
        doit *dovit=new doit;
        //doit dovit;
    private slots:
        void on_pushButton_clicked();
    
    private:
        Ui::MainWindow *ui;
    };
    #endif // MAINWINDOW_H
    

    mainwindow.cpp

    
    #include "mainwindow.h"
    #include "ui_mainwindow.h"
    
    
    MainWindow::MainWindow(QWidget *parent)
        : QMainWindow(parent)
        , ui(new Ui::MainWindow)
    {
        ui->setupUi(this);
        connect(dovit,SIGNAL(kif(QString)),this->ui->lineEdit_3,SLOT(setText(QString)));
    
    }
    
    MainWindow::~MainWindow()
    {
        delete ui;
    }
    
    
    void MainWindow::on_pushButton_clicked()
    {
        dovit->start();
    }