gpt4 book ai didi

c++ - 如何编写带有可选参数的 Q_INVOKABLE 函数?

转载 作者:行者123 更新时间:2023-12-02 14:54:05 24 4
gpt4 key购买 nike

这是我的 C++ 函数

头文件:

Q_INVOKABLE void setSelection(qint64 start, qint64 end, qint64 init);

主体文件:

void SelectionModel::setSelection(qint64 start, qint64 end, qint64 init) { 
...
}

如何将init参数修改为可选参数,这样

一个)

我可以通过以下任一方式从 JavaScript 调用该函数:

setSelection(0, 10, 4)
setSelection(0, 10)

B)

我可以在C++代码中查到是否传递了init参数。

最佳答案

其他 2 个答案都很好。要点是在 C++ 中您无法知道是否传递了默认参数。

有时您可以牺牲所用类型范围的某些部分来检测默认值:void f(int somethingThatShouldBePositive = -1)

在 C++17 中,我们现在有一种新机制可以在不牺牲范围的情况下处理此类情况:

void f(std::optional<int> a = std::optional<int>()) {
if (!a.has_value()) {
// f was called like this: f()
} else {
// f was called like this f(-1) or f(10)
}
}

但是,它不适用于 QML(或 Qt 元类型系统),因此您需要包装它:

Q_INVOKABLE void f(int a, int b) {
qDebug() << Q_FUNC_INFO;
f(a, b, std::optional<int>{});
}
Q_INVOKABLE void f(int a, int b, int c) {
qDebug() << Q_FUNC_INFO << a << b << c;
f(a, b, std::optional<int>{ c });
}
Q_INVOKABLE void f(int a, int b, std::optional<int> c){
qDebug() << Q_FUNC_INFO << a << b << c.has_value();
}

从 QML 调用:

        obj.f(1,1);
obj.f(1,2,3);

产生以下输出:

void __cdecl Object::f(int,int)
void __cdecl Object::f(int,int,class std::optional<int>) 1 1 false
void __cdecl Object::f(int,int,int) 1 2 3
void __cdecl Object::f(int,int,class std::optional<int>) 1 2 true

这正是您想要的,但只有当且仅当无法使用其他答案时,我才建议您这样做。

关于c++ - 如何编写带有可选参数的 Q_INVOKABLE 函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53854590/

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