Pengenalan:
Aplikasi Qt berbilang benang boleh menghadapi situasi di mana proses berjalan dalam tetingkap utama perlu dikemas kini daripada benang sekunder. Walau bagaimanapun, mengakses secara langsung UI tetingkap utama daripada urutan lain adalah tidak digalakkan. Artikel ini meneroka cara untuk mengemas kini tetingkap utama dengan selamat daripada urutan lain dengan memanfaatkan isyarat dan slot benang.
Pernyataan Masalah:
Dalam kod yang disediakan, kelas mitos cuba menambah QLabel pada horizontalLayout_4 tetingkap utama daripada benang yang berasingan. Walau bagaimanapun, baris ana->ui->horizontalLayout_4->addWidget(label) gagal untuk disusun.
Penyelesaian:
Untuk menangani isu ini, a pendekatan yang lebih sesuai ialah meletakkan pengubahsuaian UI dalam slot dalam tetingkap utama dan menyambung isyarat benang ke slot itu. Ini memastikan kefungsian GUI kekal dalam urutan utama dan boleh diisyaratkan daripada urutan lain.
Berikut ialah contoh:
UI Utama (MainUI.h dan 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>
Objek Pekerja (GUIUpdater.h dan 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>
Dalam contoh ini:
Dengan menggunakan pendekatan ini, pengubahsuaian UI dilakukan dalam utas utama semasa memulakan proses daripada utas berasingan. Ini memastikan keselamatan urutan dan menghalang kemungkinan isu apabila mengakses UI tetingkap utama daripada urutan yang berbeza.
Atas ialah kandungan terperinci Bagaimana untuk Mengemas kini Tetingkap Utama Qt dengan Selamat daripada Benang Berbeza?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!