문제:
멀티 스레드 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 중국어 웹사이트의 기타 관련 기사를 참조하세요!