Как управлять mainwindow из QThread в Qt - PullRequest
0 голосов
/ 17 мая 2019

Моя проблема заключается в следующем: у меня есть 2 класса (mainwindow и mythread), я запускаю поток из главного окна и хочу отобразить QLabel моего главного окна из mythread:

mythread.cpp:

void mythread::run()
{
   while(1)
   {
       this->read();
   }
}

void mythread::read()
{
    RF_Power_Control(&MonLecteur, TRUE, 0);
    status = ISO14443_3_A_PollCard(&MonLecteur, atq, sak, uid, &uid_len);
    if (status != 0){
        //display Qlabel in mainwindow
    }
}

mainwindow.cpp:

_thread = new mythread();
_thread->start();

1 Ответ

3 голосов
/ 17 мая 2019

Вы должны использовать Механизм сигналов / слотов Qt .Поток выдаст сигнал, что новые данные прочитаны.Любой заинтересованный объект может подключиться к этому сигналу и выполнять действия в зависимости от него.

Это также работает через границы потоков, как в вашем примере.В Qt требуется, чтобы только основной поток взаимодействовал с элементами пользовательского интерфейса.

Вот схема:

// Your mainwindow:
class MyWindow : public QMainWindow {
Q_OBJECT
   // as needed
private slots:
    void setLabel(const QString &t) { m_label->setText(t); }
};


// Your thread
class MyThread:  public QThread {
Q_OBJECT
  // as needed
signals:
  void statusUpdated(const QString &t);
};

// in your loop
if (status != 0) {
   emit statusUpdated("New Status!");
}

// in your mainwindow
_thread = new MyThread;
connect(_thread, &MyThread::statusUpdated, this, &MyWindow::setLabel);
_thread->start();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...