Bagaimana untuk Mengemas kini Tetingkap Utama Qt dengan Selamat daripada Benang Sekunder?

DDD
Lepaskan: 2024-10-26 13:22:29
asal
752 orang telah melayarinya

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

Qt - Mengemas kini Tetingkap Utama 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);
}
Salin selepas log masuk

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 &);
};
Salin selepas log masuk

Buat dan alihkan objek GUIUpdater ke urutan kedua:

QThread *thread = new QThread(this);
GUIUpdater *updater = new GUIUpdater();
updater->moveToThread(thread);
Salin selepas log masuk

Sambungkan isyarat NewLabel permintaan pengemas kini ke slot yang mencipta label dalam tetingkap utama:

connect(updater, SIGNAL(requestNewLabel(QString)), this, SLOT(createLabel(QString)));
Salin selepas log masuk

Gunakan kaedah NewLabel daripada urutan kedua untuk mencetuskan kemas kini:

updater->newLabel("h:/test.png");
Salin selepas log masuk

Dalam slot tetingkap utama:

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

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!

sumber:php.cn
Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan
Tentang kita Penafian Sitemap
Laman web PHP Cina:Latihan PHP dalam talian kebajikan awam,Bantu pelajar PHP berkembang dengan cepat!