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

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

DDD
DDD원래의
2024-10-26 13:22:29837검색

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

Qt - 보조 스레드에서 기본 창 업데이트

문제:

멀티 스레드 Qt 애플리케이션에서 기본 스레드가 아닌 다른 스레드에서 기본 창의 UI(mainwindow.ui)를 업데이트하면 오류가 발생합니다. 특히 다음 코드는 실패합니다.

mythread::run()
{
    QPixmap i1 (":/notes/pic/4mdodiyez.jpg");
    QLabel *label = new QLabel();
    label->setPixmap(i1);
    ana->ui->horizontalLayout_4->addWidget(label);
}

해결책:

스레드 안전 문제로 인해 Qt에서는 보조 스레드에서 UI를 직접 수정하는 것이 불가능합니다. 권장되는 접근 방식은 UI 수정 사항을 기본 창의 슬롯으로 이동하고 보조 스레드의 신호를 해당 슬롯에 연결하는 것입니다.

구현:

업데이트를 처리하기 위한 작업자 클래스:

class GUIUpdater : public QObject
{
    Q_OBJECT

public:
    explicit GUIUpdater(QObject *parent = 0) : QObject(parent) {}
    void newLabel(const QString &image) { emit requestNewLabel(image); }

signals:
    void requestNewLabel(const QString &);
};

GUIUpdater 객체를 생성하고 보조 스레드로 이동합니다.

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

업데이터의 requestNewLabel 신호를 기본 창:

connect(updater, SIGNAL(requestNewLabel(QString)), this, SLOT(createLabel(QString)));

보조 스레드에서 newLabel 메서드를 호출하여 업데이트를 트리거합니다.

updater->newLabel("h:/test.png");

기본 창의 슬롯에서:

void createLabel(const QString &imgSource) {
    QPixmap i1(imgSource);
    QLabel *label = new QLabel(this);
    label->setPixmap(i1);
    layout->addWidget(label);
}

이것은 솔루션을 사용하면 Qt의 스레드 안전 보장을 유지하면서 보조 스레드에서 안전하고 효율적인 UI 업데이트가 가능합니다.

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

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