- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
具有用于测试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
值中得到 0
。 321
哪里去了?
最佳答案
让我们来看看引擎盖下发生了什么。
似乎整数 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/
具有用于测试QMetaObject::invokeMethod 目的的简单应用程序: #include "mainwindow.h" #include "ui_mainwindow.h" MainWi
我有一个 QList 的 QGenericArgument 在我的应用程序中(实现我的事件处理程序类)。在一个特定的情况下,我需要提取一个参数的值来做一些检查。我知道类型。所以我写了这个: templ
我正在使用 Qt MetaObject 系统进行 DI IoC 开发。 class Resolver { public: template void Bind() { ... } tem
我是一名优秀的程序员,十分优秀!