>백엔드 개발 >C++ >다른 스레드에서 Qt 메인 창을 안전하게 업데이트하는 방법은 무엇입니까?

다른 스레드에서 Qt 메인 창을 안전하게 업데이트하는 방법은 무엇입니까?

DDD
DDD원래의
2024-10-26 13:52:31843검색

How to Safely Update a Qt Main Window from a Different Thread?

Qt - 다른 스레드에서 기본 창 업데이트

소개:

멀티스레드 Qt 애플리케이션은 프로세스가 실행되는 상황에 직면할 수 있습니다. 기본 창의 내용은 보조 스레드에서 업데이트해야 합니다. 그러나 다른 스레드에서 기본 창 UI에 직접 액세스하는 것은 권장되지 않습니다. 이 문서에서는 스레드 신호와 슬롯을 활용하여 다른 스레드에서 기본 창을 안전하게 업데이트하는 방법을 살펴봅니다.

문제 설명:

제공된 코드에서 Mythread 클래스 별도의 스레드에서 기본 창의 horizonLayout_4에 QLabel을 추가하려고 시도합니다. 그러나 ana->ui->horizontalLayout_4->addWidget(label) 행이 컴파일되지 않습니다.

해결책:

이 문제를 해결하려면 더 적합한 접근 방식은 기본 창의 슬롯 내에 UI 수정 사항을 배치하고 해당 슬롯에 스레드 신호를 연결하는 것입니다. 이렇게 하면 GUI 기능이 메인 스레드에 유지되고 다른 스레드에서 신호를 받을 수 있습니다.

예는 다음과 같습니다.

기본 UI(MainUI.h 및 MainUI.cpp):

<code class="cpp">class MainUI : public QWidget
{
    Q_OBJECT

public:
    explicit MainUI(QWidget *parent = 0) : QWidget(parent)
    {
        // Initialize layout and thread
        layout = new QHBoxLayout(this);
        setLayout(layout);

        QThread *thread = new QThread(this);
        GUIUpdater *updater = new GUIUpdater();
        updater->moveToThread(thread);

        // Connect thread signal to main window slot
        connect(updater, SIGNAL(requestNewLabel(QString)), this, SLOT(createLabel(QString)));
        connect(thread, SIGNAL(destroyed()), updater, SLOT(deleteLater()));

        // Initiate label creation from thread
        updater->newLabel("path/to/image.png");
    }

public slots:
    void createLabel(const QString &imgSource)
    {
        // Create and add label to layout in main thread
        QPixmap i1(imgSource);
        QLabel *label = new QLabel(this);
        label->setPixmap(i1);
        layout->addWidget(label);
    }

private:
    QHBoxLayout *layout;
};</code>

작업자 개체(GUIUpdater.h 및 GUIUpdater.cpp):

<code class="cpp">class GUIUpdater : public QObject
{
    Q_OBJECT

public:
    explicit GUIUpdater(QObject *parent = 0) : QObject(parent) {}

    void newLabel(const QString &image)
    {
        // Emit signal to main window
        emit requestNewLabel(image);
    }

signals:
    void requestNewLabel(const QString &);
};</code>

이 예에서는:

  • MainUI는 UI 업데이트를 받는 기본 창입니다.
  • GUIUpdater는 별도의 스레드에서 생성된 작업자 개체입니다.
  • 별도의 스레드에서 GUIUpdater::newLabel을 호출하면 requestNewLabel을 내보냅니다. signal.
  • MainUI.createLabel 슬롯은 requestNewLabel 신호에 연결되므로 GUI 업데이트가 메인 스레드 내에서 안전하게 수행될 수 있습니다.

이 접근 방식을 사용하면 UI 수정이 수행됩니다. 별도의 스레드에서 프로세스를 시작하는 동안 메인 스레드에서. 이는 스레드 안전성을 보장하고 다른 스레드에서 기본 창의 UI에 액세스할 때 발생할 수 있는 문제를 방지합니다.

위 내용은 다른 스레드에서 Qt 메인 창을 안전하게 업데이트하는 방법은 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.