如何从另一个线程关闭对话框? Qt
How I can close dialog, from another thread? Qt
我想这样处理我的按钮:
- 更改标签上的文字(类似于 "Please wait...")
- 从数据库下载一些数据
- 下载完成后,关闭对话框,这个按钮在哪里。
当我这样做时:
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
有什么建议吗?
首先,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();
});
}
我想这样处理我的按钮:
- 更改标签上的文字(类似于 "Please wait...")
- 从数据库下载一些数据
- 下载完成后,关闭对话框,这个按钮在哪里。
当我这样做时:
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
有什么建议吗?
首先,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();
});
}