Как перекрасить другой класс Qt - PullRequest
0 голосов
/ 14 апреля 2010

Я новый бит в Qt ...

У меня есть приложение Qt GUI (написанное мной), назовем его QtAPP.exe Когда QtAPP.exe запущен, я буду использовать QThread и QProcess для выполнения какого-либо внешнего файла, например player.exe (написанный на родном C).

Вот мой вопрос: В QtAPP.exe есть 2 класса, 1. QMainWindow - ядро ​​QtAPP.exe 2. QThread - класс потока для выполнения внешних вещей

А пока, если я получу сигнал Finished () в этом QThread, как заставить QMainWindow перекрасить себя?

Надеюсь, кто-нибудь может показать мне несколько советов, может быть, пример кода :) Любые предложения приветствуются ~

1 Ответ

1 голос
/ 14 апреля 2010

Одним из решений было бы просто подключить сигнал Finish () к слоту в MainWindow, реализация которого вызывает update (). Обратите внимание, что доставка этого сигнала будет асинхронной, поскольку объекты отправителя и получателя находятся в разных потоках.

Вот рабочий пример:

main.cpp

#include <QtGui/QApplication>
#include "stuff.h"

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

stuff.h

#ifndef STUFF_H
#define STUFF_H

#include <QtGui/QMainWindow>
#include <QtCore/QThread>

class QLabel;

class Thread : public QThread
{
    Q_OBJECT
public:
    Thread(QObject *parent);
    void run();

private:
    void startWork();

signals:
    void workFinished();
};

class MainWindow : public QWidget
{
    Q_OBJECT
public:
    MainWindow();

public slots:
    void startWork();
    void workFinished();

private:
    QLabel* m_label;
    Thread* m_thread;
};

#endif

stuff.cpp

#include <QtCore/QTimer>
#include <QtCore/QMutex>
#include <QtCore/QWaitCondition>
#include <QtGui/QVBoxLayout>
#include <QtGui/QPushButton>
#include <QtGui/QLabel>
#include "stuff.h"

#include <QDebug>

// Global variables used for ITC
QWaitCondition buttonPressed;
QMutex mutex;

Thread::Thread(QObject *parent)
    :   QThread(parent)
{

}

void Thread::run()
{
    qDebug() << "Thread::run" << QThread::currentThreadId();
    while (1) {
        mutex.lock();
        buttonPressed.wait(&mutex);
        mutex.unlock();
        startWork();
    }
}

void Thread::startWork()
{
    qDebug() << "Thread::startWork" << QThread::currentThreadId();
    // Simulate some long-running task
    sleep(3);
    // Emit a signal, which will be received in the main thread
    emit workFinished();
}


MainWindow::MainWindow()
    :   m_label(new QLabel(this))
    ,   m_thread(new Thread(this))
{
    QPushButton *button = new QPushButton("Start", this);
    connect(button, SIGNAL(pressed()), this, SLOT(startWork()));

    QVBoxLayout *layout = new QVBoxLayout(this);
    layout->addWidget(button);
    layout->addWidget(m_label);
    setLayout(layout);

    // Create connection across thread boundary
    connect(m_thread, SIGNAL(workFinished()), this, SLOT(workFinished()));

    m_thread->start();
}

void MainWindow::startWork()
{
    // Signal the thread to tell it that the button has been pressed
    mutex.lock();
    m_label->setText("Started");
    buttonPressed.wakeAll();
    mutex.unlock();
}

void MainWindow::workFinished()
{
    qDebug() << "MainWindow::workFinished" << QThread::currentThreadId();
    m_label->setText("Finished");
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...