gpt4 book ai didi

c++ - 使用 QtConcurrent::run 在单独的线程上连接信号/插槽

转载 作者:塔克拉玛干 更新时间:2023-11-03 07:33:13 28 4
gpt4 key购买 nike

在我的应用程序中,对话框中有以下代码:

connect(drive, SIGNAL(FileProgressChanged(Progress)), SLOT(OnFileProgressChanged(Progress)));

QtConcurrent::run(this, &ProgressDialog::PerformOperation, Operation, *Path, OutPath, drive);

PerformOperation 函数最终调用 drive 中的函数,该函数发出信号 FileProgressChanged,而我的 OnFileProgressChanged 函数如下所示:

void ProgressDialog::OnFileProgressChanged(Progress p)
{
if (ui->progressCurrent->maximum() != p.Maximium)
ui->progressCurrent->setMaximum(p.Maximium);

ui->progressCurrent->setValue(p.Current);

if (ui->groupBoxCurrent->title().toStdString() != p.FilePath)
ui->groupBoxCurrent->setTitle(QString::fromStdString(p.FilePath));
}

我在看书时看到 QFutureQFutureWatcher支持监控进度值(在这种情况下效果很好!),但不能与 QtConcurrent::run 结合使用。

我如何将在单独线程上发出的移动信号连接到我的主线程上的插槽,以便我可以监视在发射器线程上调用的函数的进度?

*编辑 -- * 我实际上发现我的代码有错误,但它似乎没有影响。我忘了在信号之后添加 this 作为参数

connect(drive, SIGNAL(FileProgressChanged(Progress)), this, SLOT(OnFileProgressChanged(Progress)));

最佳答案

尝试使用 connect()QueuedConnection ,比如:

connect(drive, SIGNAL(FileProgressChanged(Progress)), this, SLOT(OnFileProgressChanged(Progress)), Qt::QueuedConnection);

默认情况下连接应该已经排队(因为发射器和接收器在不同的线程中),但这只是让它更明确。

编辑:问题是 Progress type 没有在 Qt 的元对象系统中注册。添加qRegisterMetaType<Progress>("Progress");解决了问题。

关于c++ - 使用 QtConcurrent::run 在单独的线程上连接信号/插槽,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9367582/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com