【问题标题】:How to use QScopedPointer in lambda function?如何在 lambda 函数中使用 QScopedPointer?
【发布时间】:2021-07-01 14:05:46
【问题描述】:

我使用 QScopedPointer 实用程序创建了一个小部件对象,并将其用于 lambda 连接函数。结果,它产生了编译时错误。

 QScopedPointer<QMessageBox> errBox(new QMessageBox());
    errBox->setText("some text");
    QObject::connect(errBox,&QMessageBox::buttonClicked,this,[=](QAbstractButton *button){
        qInfo()<<"clicked button"<<button->text();
    });

但是,当我用正常初始化替换 QScopedPointer 时,它工作得很好。

QMessageBox *errBox = new QMessageBox();
errBox->setText("some text");
QObject::connect(errBox,&QMessageBox::buttonClicked,this,[=](QAbstractButton *button){
    qInfo()<<"clicked button"<<button->text();
});

我浏览了 Qt Docs 并发现:

编译器为 QScopedPointer 生成的代码与当 手动编写。使用 delete 的代码是 QScopedPointer 用法(如果没有,可能是另一种类型的智能 指针,例如 QSharedPointer)。 QScopedPointer 故意没有 复制构造函数或赋值运算符,这样所有权和 清楚地传达了生命周期。

我想知道编译错误的原因。还有其他方法可以在 lambda 中使用 QScopedPointer 吗? 我在这里错过了什么?

【问题讨论】:

  • 编译时错误的文本是否出于某种原因而成为秘密?

标签: c++ qt qt5


【解决方案1】:

问题不在于 lambda。问题是,像std::unique_ptr 一样,QScopedPointer 不会自动转换为指针,因此您的编译器可能会抱怨找不到QObject::connectQScopedPointer。试试:

QObject::connect(errBox.get(), ...

【讨论】:

    猜你喜欢
    • 2019-02-08
    • 1970-01-01
    • 2016-11-13
    • 2020-08-06
    • 2022-01-27
    • 2021-08-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多