简体   繁体   中英

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

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();
}


The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM