簡體   English   中英

如何從另一個線程關閉對話框? t

[英]How I can close dialog, from another thread? Qt

我想以這種方式處理按鈕:

  1. 更改標簽上的文字(例如“請稍候...”)
  2. 從數據庫下載一些數據
  3. 下載完成后,關閉對話框,該按鈕在哪里。

當我這樣做時:

void LoadingDialog::on_pushButton_clicked()
{
m_ui->labelStatus->setText("Pobieranie wysyłek...");

if(m_methodToDo == MethodToDo::LoadShipment)
{
    if(DataManager::getManager()->loadShipments())
    {
        this->close();
    }
}
}

標簽未更改文本,延遲幾秒鍾(正在下載幾千條記錄)並且對話框關閉。

當我嘗試這個:

void LoadingDialog::changeStatus(QString status)
{
m_ui->labelStatus->setText(status);
}

bool LoadingDialog::load()
{
if(m_methodToDo == MethodToDo::LoadShipment)
{
    if(DataManager::getManager()->loadShipments())
    {
        this->close();
    }
}
}

void LoadingDialog::on_pushButton_clicked()
{
QFuture<void> future3 = QtConcurrent::run([=]() {
    changeStatus("Pobieranie wysyłek..."); // "Downloading.."
});

QFuture<void> future = QtConcurrent::run([=]() {
    load();
});
}

標簽上有更改文本-沒問題,只是幾秒鍾的延遲-沒關系,但對話框沒有關閉,我的應用程序拋出異常:

Cannot send events to objects owned by a different thread. Current thread 229b1178. Receiver 'Dialog' (of type 'LoadingDialog') was created in thread 18b00590

有什么建議嗎?

首先,changeStatus不會阻塞,因此不要在另一個線程上運行它。 另一方面,如果要從另一個線程調用插槽,則可以使用QMetaObject::invokeMethod()

bool LoadingDialog::load()
{
    if(m_methodToDo == MethodToDo::LoadShipment)
        if(DataManager::getManager()->loadShipments())
            QMetaObject::invokeMethod(this, "close", Qt::QueuedConnection);
}

void LoadingDialog::on_pushButton_clicked()
{
    changeStatus("Pobieranie wysyłek..."); // "Downloading.."

    QFuture<void> future = QtConcurrent::run([=]() {
        load();
    });
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM