Rumah > Artikel > pembangunan bahagian belakang > Bagaimana untuk Mengemas kini Tetingkap Utama Qt dengan Selamat daripada Benang Sekunder?
Masalah:
Dalam aplikasi Qt berbilang benang, percubaan untuk kemas kini UI tetingkap utama (mainwindow.ui) daripada utas selain daripada utas utama mengakibatkan ralat. Khususnya, kod berikut gagal:
mythread::run() { QPixmap i1 (":/notes/pic/4mdodiyez.jpg"); QLabel *label = new QLabel(); label->setPixmap(i1); ana->ui->horizontalLayout_4->addWidget(label); }
Penyelesaian:
Mengubah suai UI daripada urutan kedua tidak dapat dilakukan secara langsung dalam Qt kerana kebimbangan keselamatan rangkaian. Pendekatan yang disyorkan adalah untuk mengalihkan pengubahsuaian UI ke slot dalam tetingkap utama dan menyambung isyarat daripada urutan kedua ke slot itu.
Pelaksanaan:
Laksanakan kelas pekerja untuk mengendalikan kemas kini:
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 &); };
Buat dan alihkan objek GUIUpdater ke urutan kedua:
QThread *thread = new QThread(this); GUIUpdater *updater = new GUIUpdater(); updater->moveToThread(thread);
Sambungkan isyarat NewLabel permintaan pengemas kini ke slot yang mencipta label dalam tetingkap utama:
connect(updater, SIGNAL(requestNewLabel(QString)), this, SLOT(createLabel(QString)));
Gunakan kaedah NewLabel daripada urutan kedua untuk mencetuskan kemas kini:
updater->newLabel("h:/test.png");
Dalam slot tetingkap utama:
void createLabel(const QString &imgSource) { QPixmap i1(imgSource); QLabel *label = new QLabel(this); label->setPixmap(i1); layout->addWidget(label); }
Ini penyelesaian membenarkan kemas kini UI yang selamat dan cekap daripada urutan kedua sambil mengekalkan jaminan keselamatan rangkaian Qt.
Atas ialah kandungan terperinci Bagaimana untuk Mengemas kini Tetingkap Utama Qt dengan Selamat daripada Benang Sekunder?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!