当前位置: 首页 > 知识库问答 >
问题:

QT5.15:如何从QtConcurrent函数访问小部件对象

阎慈
2023-03-14

我希望从QtConcurrent函数更新一个进度条小部件,但遇到以下问题:

a)如果我将此功能声明为:

void myRunFunction(QString str)

然后,我成功地通过以下方法将其编程为并发:

QFuture<void> t1 = QtConcurrent::run(myRunFunction, QString("A"));

但是我不能从函数内部访问GUI的任何Qt小部件(“无法解析标识符'widget'”)。

b)如果我宣布这一职能为:

void mainForm::myRunFunction(QString str)

然后,我成功地访问了它内部的小部件,但不能再将其编程为并发,从而得到编译器错误:

error: invalid use of non-static member function ‘void mainForm::myRunFunction(QString)’

在行:

QFuture<void> t1 = QtConcurrent::run(myRunFunction, QString("A"));

我怎样才能解决问题呢? 多谢你,马可

共有1个答案

周墨一
2023-03-14

我建议使用闭包(带有捕获的lambda)。 但是要小心你的对象的寿命。

还要使用异步信号/插槽连接在线程之间通信-Qt::QueuedConnection。 最好不要直接调用小部件,而是调用提供必要数据的特定插槽,这样就可以对它们执行任何您想要的操作。

// mainwindow.h
class MainWindow : public QMainWindow
{
    Q_OBJECT

public:
    MainWindow(QWidget *parent = nullptr);
    ~MainWindow() {};

private:
    void function_slot(int data) {
        // update widget
    }

signals:
    void function_signal(int data);
};

和。cpp文件中的某个位置:

// declare a lambda
auto f = [this] (QString str) 
{
    for (int i = 0; i < 100; ++i) {
        // do some job
        // ...
        // job is done
        // send progress data to mainwidget
            emit function_signal(i);
    }
};

// queued thread-safe connection
connect(this, &MainWindow::function_signal, this, &MainWindow::function_slot, Qt::QueuedConnection);

auto t1 = QtConcurrent::run(f, "string");
 类似资料:
  • 我正在尝试访问存储在AWS3桶中的文本文件。目前,它只包含“测试”一词。 起初,我以为我的fs.readfile有问题,但现在我发现问题更根本。我根本无法访问该文件。node.js的AWS似乎根本无法看到该文件。 我正在使用以下Lambda函数: 测试床函数包含以下代码: 结果如下所示(我删除了时间戳和请求ID文本): 由此,我得出结论,没有调用S3函数,尽管我可能弄错了。 我做错了什么?

  • 问题内容: 我想知道如何访问另一个函数中的一个函数。我看到了这样的代码: 那么,还有另一种方法来调用该 函数吗?我的第二个问题是,为什么在最后一行中我不打电话? 很好的解释深表感谢。 问题答案: 不,您不能直接调用它,因为它是的局部变量。 您需要使用,因为调用时返回了函数对象。要执行此功能对象,您需要 在这里您可以直接调用它,因为您可以访问它,因为它是由函数返回的。返回的对象实际上称为 闭包, 因

  • 问题内容: 我想知道什么? 如果释放具有ID:button_b(Get_Boys类)的按钮,则必须更改具有ID:label_g(Get_Girls类)的Label。 如果按下ID为:button_b的Button(Get_Boys类),则ID为root_lbl的Label(Get_People类)必须更改。 如果发布了ID为:root_btn(Get_People类)的Button,则ID为:la

  • 我在Kotlin编程,我有日期类的扩展功能。 它在< code>onCreate中工作正常,但是在< code >异步任务中的< code>doInBackground中出现错误 我里面有这些线 < code > getCurrentDateTime()返回< code>Date类的实例,并且为< code>toString()中的参数给出了错误 也可以参数为公共开放的乐趣toString():字

  • 问题内容: 我有以下数组,当我做得到: 我试图按如下方式访问数组: 但这显示了我: 未定义0 注意: 我从 Facebook SDK 4 获得此数组,所以我不知道原始的数组结构。 作为示例,如何访问数组中的值? 问题答案: 要访问或您如何使用两个不同的运算符。 数组 要访问数组元素,您必须使用,或者您不会看到太多,但也可以使用is 。 声明数组和访问数组元素之间的区别 定义数组和访问数组元素是两件

  • 我有一个组件反应本机: 最后一行是将在新位置调用的回调方法。 通过该方法,我无法访问或 如何从回调函数更新状态?

  • 我想在构造函数中访问多个位置的状态值。当我在构造函数中输入console.log(this)时,我可以看到可以访问特定的值,但是当我输入console.log this.state时,我没有定义。 这就是我想象的工作方式(我想访问CSSValue中的状态): 但是,当我运行此代码: 然后我在控制台中得到这个: 但是当我将console.logconsole.log(this.state)它打印未定

  • 我一直不明白为什么我们能够从其他类调用一个类的构造函数。构造函数是一种方法,通常当试图从类中调用方法时,我们必须要么使该方法静态,这样我们就可以以 但是在构造函数的情况下,我们两者都不做。Java如何调用类的构造函数而不执行这些方法中的任何一个?我知道一个类的构造函数必须对你调用它的类可见,也就是说,如果你调用的类构造函数在不同的包中,你必须导入那个包。 那么,Java如何处理调用构造函数,而不必