如何从另一个线程关闭对话框? Qt

Posted

技术标签:

【中文标题】如何从另一个线程关闭对话框? Qt【英文标题】:How I can close dialog, from another thread? Qt 【发布时间】:2019-02-19 13:04:34 【问题描述】:

我想以这种方式处理我的按钮:

    更改标签上的文字(类似于“请稍候...”) 从数据库中下载一些数据 下载完成后,关闭对话框,此按钮在哪里。

当我这样做时:

void LoadingDialog::on_pushButton_clicked()

m_ui->labelStatus->setText("Pobieranie wysyłek...");

if(m_methodToDo == MethodToDo::LoadShipment)

    if(DataManager::getManager()->loadShipments())
    
        this->close();
    


标签没有更改文本,延迟几秒(正在下载几 k 条记录)并且对话框正在关闭。

当我尝试这个时:

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

有什么建议吗?

【问题讨论】:

如何将线程完成后发出的信号连接到某个插槽以执行您想要的操作 如果您按照@Spinkoo 的建议使用信号和插槽,您需要确保使用 QueuedConnection 进行连接。如果不这样做,您可能会在发出信号的同一线程中调用插槽。 【参考方案1】:

首先,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();
    );

【讨论】:

以上是关于如何从另一个线程关闭对话框? Qt的主要内容,如果未能解决你的问题,请参考以下文章

PyQT:如何从另一个对话框(QMainWindow)中调用对话框

如何从另一个 Qt Widget 表单类调用 MainWindow 类

Qt:如何关闭用 exec() 打开的对话框窗口?

Qt的模态对话框和非模态对话框 经常使用setAttribute (Qt::WA_DeleteOnClose)

如何关闭和删除无模式的 qt 对话框

关闭从另一个对话框片段启动的对话框片段会导致非法状态异常