c++ - 如何编写带有可选参数的 Q_INVOKABLE 函数?
问题描述
这是我的 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)
二)
我可以在 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
这正是您想要的,但我建议仅当且仅当无法使用其他答案时才这样做。
推荐阅读
- swift - 手动放置的 UIPageControl 在旋转事件时离开屏幕
- go - 如何增加 klog 级别的详细程度?
- html - 如何在不同尺寸的屏幕上使用背景图像在适当的位置设置表单
- python - 关于 XPath 选择器的问题(对于 Scrapy)
- php - Laravel 5.8 中未捕获的错误“找不到类”
- dart - 如何创建一个流,然后创建另一个流?
- amazon-web-services - 使用 DDB、Kinesis 和 SNS 的高级解决方案
- linux - 我想在 EFS 挂载路径中部署 github 代码
- javascript - ajax 没有激活,带我到另一个页面
- youtube-api - 无法从 youtube 数据 api 接收活动数据?