Top.Mail.Ru
Уведомления
Очистить все

[Решено] Обновление GUI из другого потока в QT

(@darkone)
New member

Добрый день,

у меня есть класс DataReceiver, он работает в отдельном потоке. В mainwindow.cpp создаю экземпляр класса и переношу в другой поток:

dataReceiver = new DataReceiver();
dataReceiver->moveToThread(&receiverThread);
receiverThread.start();

Теперь я хочу по приему данных в dataReceiver вывести эти данные в QTextEdit в MainWindow. Как это правильно сделать с точки зрения работы в разных потоках?

Цитата
Создатель темы Размещено : 12.11.2021 12:13
AI
 AI
(@ai)
Level 3 Moderator

Стандартная практика - через механизм сигналов и слотов. dataReceiver генерирует сигнал, MainWindow его обрабатывает и в слоте помещает данные в свой QTextEdit. Какого рода данные нужно отображать?

ОтветитьЦитата
Размещено : 12.11.2021 14:14
(@darkone)
New member

@ai Одну строку QString. dataReceiver все свои данные упаковывает в нее.

ОтветитьЦитата
Создатель темы Размещено : 12.11.2021 18:27
AI
 AI
(@ai)
Level 3 Moderator

@darkone Тогда так:

mainwindow.h:

private slots:
    void dataUpdatedSlot(QString data);

datareceiver.h:

signals:
    void dataUpdatedSignal(QString data);

mainwindow.cpp:

connect(dataReceiver, &DataReceiver::dataReceivedSignal, this, &MainWindow::dataReceivedSlot);

в datareceiver.cpp при готовности новых данных:

emit dataReceivedSignal(dataString);

в mainwindow.cpp эти данные будут получены в слоте:

void MainWindow::dataReceivedSlot(QString data)
{
    ui->textEdit->setText(data);
}
ОтветитьЦитата
Размещено : 13.11.2021 11:29
(@darkone)
New member

@ai спасибо за подробный ответ, идею уловил 😊 

ОтветитьЦитата
Создатель темы Размещено : 14.11.2021 11:52
Поделиться: