- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我习惯用参数编写我的“propertyChanged”signal
,这样接收端就不需要调用Q_PROPERTY
的READ
功能显式。
我这样做是为了清楚起见,并假设在 QML 数据绑定(bind)情况下,不需要对 getter 进行“昂贵的”调用来实际获取值,因为它已经作为信号参数传递给 QML。
我的同事不同意并说这违反了“QML 风格”,对此我的回应是文档明确指出它可能有一个参数将采用底层成员的新值:
NOTIFY
signals forMEMBER
variables must take zero or one parameter, which must be of the same type as the property. The parameter will take the new value of the property.
文档中没有任何地方指出 QML 绑定(bind)系统使用此参数来防止在处理信号时对 getter 进行额外的函数调用。我知道这个调用可能是从 C++ 进行的,因此不会进行“昂贵”的 QML 到 C++ 调用,但它仍然是一个额外的函数调用,原则上在许多更新的情况下可能会导致明显的性能损失。
我尝试检查 QML 绑定(bind)源代码,但无法从中推断出任何信息。我想知道是否有人知道这是怎么回事:是否使用了信号参数?
最佳答案
I wonder if someone knows what the deal is: is the signal argument used or not?
这是一种检查方法:
#include <QApplication>
#include <QQmlApplicationEngine>
#include <QDebug>
class MyType : public QObject
{
Q_OBJECT
Q_PROPERTY(bool foo READ foo WRITE setFoo NOTIFY fooChanged)
public:
MyType(QObject *parent = nullptr) :
QObject(parent),
mFoo(0)
{
}
bool foo() const
{
qDebug() << Q_FUNC_INFO;
return mFoo;
}
void setFoo(bool foo)
{
if (foo == mFoo)
return;
mFoo = foo;
emit fooChanged(mFoo);
}
signals:
void fooChanged(bool foo);
private:
bool mFoo;
};
int main(int argc, char *argv[])
{
QCoreApplication::setAttribute(Qt::AA_EnableHighDpiScaling);
QApplication app(argc, argv);
qmlRegisterType<MyType>("App", 1, 0, "MyType");
QQmlApplicationEngine engine;
engine.load(QUrl(QLatin1String("qrc:/main.qml")));
return app.exec();
}
#include "main.moc"
main.qml:
import QtQuick 2.0
import QtQuick.Window 2.0
import QtQuick.Controls 2.0
import App 1.0
Window {
width: 400
height: 400
visible: true
Switch {
id: fooSwitch
}
MyType {
id: myType
foo: fooSwitch.checked
onFooChanged: print("onFooChanged, foo =", foo)
// onFooChanged: print("onFooChanged myType.foo =", myType.foo)
}
}
来回切换时的输出为:
qml: onFooChanged, foo = true
qml: onFooChanged, foo = false
所以可以肯定地说使用的是值而不是 getter。
若要查看未使用信号参数时的输出结果,请取消注释掉的行并注释掉另一行:
bool __cdecl MyType::foo(void) const
qml: onFooChanged myType.foo = true
bool __cdecl MyType::foo(void) const
qml: onFooChanged myType.foo = false
关于c++ - Q_PROPERTY NOTIFY 信号及其参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43705363/
在此: Q_PROPERTY(QString datastring READ showdata() NOTIFY datastringChanged) 是datastringChanged用于在 QM
我正在使用 Q_PROPERTY s 在我的项目中,我试图找出向这些属性添加一些属性的最佳方法( like min and max value )。 看起来没有任何地方可以在属性本身上存储这些属性..
我的目标是实现更多的代码重用,同时保持冗长。 考虑以下示例代码: // qdot@defixio /tmp/test4 $ cat test.h #include class Foo : publi
我正在将 Q_PROPERTY 与 QML 一起使用。我的代码是: using namespace std; typedef QString lyricsDownloaderString; // th
考虑这些类: Class A : public QObject { ... Q_PROPERTY(int value READ value WRITE setValue NOTIFY
考虑这些类: Class A : public QObject { ... Q_PROPERTY(int value READ value WRITE setValue NOTIFY
我正在尝试将抽象类的实例用作我的一个扩展 QQuickItems 中的属性。我有一个基础类(class),像这样: class VizFactory : public QQuickItem {
我有一个 Configuration,其中包含一些关于文件位置的基本信息,例如下载、安装、图片、音乐、文档等位置。这些目前使用 Q_PROPERTY 暴露给 QML。它们都有自己的访问器: Q_PRO
我是 QT 属性系统的新手,我想了解为什么如果我以一种方式注册和使用属性,它可以工作,但以另一种方式失败。 我有两个类( A 和 B )都继承自 QObject .类 B包含类 A 的几个实例我想注册
我有两个类,TestA 和 TestB。 TestA 扩展了 QObject。我用一些 Q_PROPERTY 设置了它。 Q_PROPERTY(QString a_string READ getStr
我是 Qt 和 C++ 的新手,但长期使用 Delphi 程序员。 我有一个简单的类,我正在尝试将属性添加到: class Rectangle { Q_PROPERTY(int width R
我有这个属性: Q_PROPERTY(int _a READ a WRITE setA NOTIFY aChanged) 我只知道属性的名称 _a。我想获取方法 setA 的索引。 最佳答案 查看 Q
http://doc.qt.io/qt-5/qtqml-cppintegration-exposecppattributes.html class Message : public QObject {
如何将 Q_PROPERTY 宏放入另一个辅助宏中? #define SimpleAllinOne(member, _type) \ public: \ void Set##member(_t
我习惯用参数编写我的“propertyChanged”signal,这样接收端就不需要调用Q_PROPERTY的READ 功能显式。 我这样做是为了清楚起见,并假设在 QML 数据绑定(bind)情况
TL;DR:如何为与使用 Q_PROPERTY 声明的属性同名的访问器生成 doxygen 文档? Qt 的 property system使得在给定属性上使用 Qt 的元对象系统成为可能: // e
我真的想不通为什么我需要它,一直在阅读: http://doc.qt.io/qt-4.8/properties.html#requirements-for-declaring-properties 还
众所周知,继承的信号不能用作Q_PROPERTY NOTIFYer ( https://bugreports.qt.io/browse/QTBUG-7684 )。作为一种解决方法,我在派生类中使用了一
我有一个非常简单的类,它有两个属性;键和值: KeyValue.h: class KeyValue : public QObject { Q_OBJECT Q_PROPERTY(QString
问题 我正在制作一个使用 Q_OBJECT 和 Q_PROPERTY 从脚本访问一些对象的项目。我有两个问题: 使使用前向声明的类可编写脚本 返回一个属性作为指针 说明 1. 为什么要提前申报? 类
我是一名优秀的程序员,十分优秀!