Rumah  >  Artikel  >  pembangunan bahagian belakang  >  Bagaimana untuk Mengemas kini Tetingkap Utama Qt dengan Selamat daripada Benang Sekunder?

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

DDD
DDDasal
2024-10-26 13:22:29831semak imbas

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);
}

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!

Kenyataan:
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