소개:
멀티스레드 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>
이 예에서는:
이 접근 방식을 사용하면 UI 수정이 수행됩니다. 별도의 스레드에서 프로세스를 시작하는 동안 메인 스레드에서. 이는 스레드 안전성을 보장하고 다른 스레드에서 기본 창의 UI에 액세스할 때 발생할 수 있는 문제를 방지합니다.
위 내용은 다른 스레드에서 Qt 메인 창을 안전하게 업데이트하는 방법은 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!