palin
palin

Reputation: 1

Qt C++: Cannot create children for a parent that is in a different thread

Create a simple application in Qt (c ++) to encrypt a text. And I get the error: "Cannot create children for a parent that is in a different thread."

I used threads to update a text edit box in real time while entering text.

I saw other similar topics, but I did not find any solution that I could adapt to myself.

Can you please suggest me how I can solve it?

.h file

#ifndef GENERATORSHACODE_H
#define GENERATORSHACODE_H

#include <QMainWindow>
#include <thread>

QT_BEGIN_NAMESPACE
namespace Ui { class GeneratorShaCode; }
QT_END_NAMESPACE

class GeneratorShaCode : public QMainWindow
{
    Q_OBJECT

public:
    GeneratorShaCode(QWidget *parent = nullptr);
    ~GeneratorShaCode();
    QString Sha512Generator(QString);
    void updateOutputEditText();
    std::thread GenerateCode;

private:
    Ui::GeneratorShaCode *ui;
};
#endif // GENERATORSHACODE_H

.cpp file

#include "generatorshacode.h"
#include "ui_generatorshacode.h"
#include <windows.h>
#include "sha512.h"
#include <string>

#include <QtDebug>

GeneratorShaCode::GeneratorShaCode(QWidget *parent)
    : QMainWindow(parent)
    , ui(new Ui::GeneratorShaCode)
{
    ui->setupUi(this);

    GenerateCode = std::thread(&GeneratorShaCode::updateOutputEditText, this);
    GenerateCode.detach();
}

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

QString GeneratorShaCode::Sha512Generator(QString Qstr)
{
    return QString::fromStdString(sha512(Qstr.toStdString()));
}

void GeneratorShaCode::updateOutputEditText()
{
    while(true)
    {
       ui->textEdit_Output->setText(Sha512Generator(ui->textEdit_Input->toPlainText()));
    }
}

Upvotes: 0

Views: 601

Answers (1)

Allen Zhu
Allen Zhu

Reputation: 870

GUI thread is the main thread. You can't operate any ui controls directly within a sub thread. Usually you should use signals/slots between GUI thread and sub thread.

Upvotes: 1

Related Questions