gpt4 book ai didi

c++ - 创建 QGenericArgument

转载 作者:行者123 更新时间:2023-11-27 22:39:08 25 4
gpt4 key购买 nike

具有用于测试QMetaObject::invokeMethod 目的的简单应用程序:

#include "mainwindow.h"
#include "ui_mainwindow.h"

MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MainWindow)
{
ui->setupUi(this);
}

MainWindow::~MainWindow()
{
delete ui;
}

void MainWindow::setText( int value)
{
QString s = QString::number(value);
ui->textEdit->setText(s);
}





void MainWindow::on_pushButton_clicked()
{
QGenericArgument genericArg = Q_ARG(int, 321);
bool inv = QMetaObject::invokeMethod( this,"setText",Qt::QueuedConnection, genericArg);
qDebug("inv = %d\n", inv);
}

我在 setText 值中得到 0321 哪里去了?

最佳答案

让我们来看看引擎盖下发生了什么。

似乎整数 321 被视为 (const) ref https://doc.qt.io/qt-5/qmetaobject.html#Q_ARG :

QGenericArgument Q_ARG(Type, Type &value)
QGenericArgument Q_ARG(Type, const Type &value)

Q_ARG 只是一个宏:

#define Q_ARG(type, data) QArgument<type >(#type, data)

.. 返回类 QArugment 的对象:

template <class T>
class QArgument: public QGenericArgument
{
public:
inline QArgument(const char *aName, const T &aData)
: QGenericArgument(aName, static_cast<const void *>(&aData))
{}
};

... 又基于QGenericArgument:

class Q_CORE_EXPORT QGenericArgument
{
public:
inline QGenericArgument(const char *aName = Q_NULLPTR, const void *aData = Q_NULLPTR)
: _data(aData), _name(aName) {}
inline void *data() const { return const_cast<void *>(_data); }
inline const char *name() const { return _name; }

private:
const void *_data;
const char *_name;
};

整个链只包含指向数据的 const 指针,因此可以肯定的是,问题在于对临时对象的悬空引用。

由于数据 321 只是一个临时数据,因此当 Q_ARG 被解析为构造函数时,它首先绑定(bind)到一个 const 引用,这样就可以了。

但是,根据cppreference标准的解释:https://en.cppreference.com/w/cpp/language/reference_initialization#Lifetime_of_a_temporary问题似乎是由于:

Whenever a reference is bound to a temporary or to a subobject thereof, the lifetime of the temporary is extended to match the lifetime of the reference, with the following exceptions:

(...)

a temporary bound to a reference member in a constructor initializer list persists only until the constructor exits, not as long as the object exists. (note: such initialization is ill-formed as of DR 1696)

如果我的解释是正确的(不确定 pointer == reference 在这种情况下),那么程序处于快乐的未定义行为状态(Qt 需要取消引用悬空指针/ref运行 invokeMethod)。

因为它没有崩溃并使用 0 值(你怎么知道它被调用了?你调试过它了吗?)可能是你的构建配置隐藏了问题。

关于c++ - 创建 QGenericArgument,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50486892/

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