精华内容
下载资源
问答
  • 如何动态获取Android系统属性

    千次阅读 2018-07-19 18:52:04
    Android设备有很多系统属性,比如说Android版本号,比如品牌,型号,比如厂商操作系统的版本号等,我们经常会要用到这些属性,那怎么获取呢? 最简单的办法,就是连接USB调试后,在命令行输入 adb shell getprop ...

    Android设备有很多系统属性,比如说Android版本号,比如品牌,型号,比如厂商操作系统的版本号等,我们经常会要用到这些属性,那怎么获取呢?

    最简单的办法,就是连接USB调试后,在命令行输入 adb shell getprop xxx查看结果,其中xxx是系统属性名称。当然我们首先得知道这个属性名称才行。
    但是如果我们不只是要看到结果,还要在代码里动态获取并且使用,该怎么办呢?可以用如下几个办法:

    一、android.os.Build这个类里有很多静态属性,如下属性我们可以直接用Build.XXX来得到:

    Build.BOARD // 主板
    Build.BRAND // 系统定制商
    Build.SUPPORTED_ABIS //CPU指令集
    Build.DEVICE // 设备参数
    Build.DISPLAY // 显示屏参数
    Build.FINGDERPRINT // 唯一编号
    Build.SERIAL // 硬件序列号
    Build.ID // 修订版本列表
    Build.MANUFACTURER // 硬件制造商
    Build.MODEL //版本
    Build.HARDWARE //硬件名
    Build.PRODUCT //手机产品名
    Build.TAGS // 描述build的标签
    Build.TYPE // Builder类型
    Build.VERSION.CODENAME //当前开发代号
    Build.VERSION.INCREMENTAL //源码控制版本号
    Build.VERSION.RELEASE //版本字符串
    Build.VERSION.SDK_INT //Android版本号
    Build.HOST // HOST值
    Build.USER // User名
    Build.TIME // 编译时间

    比如我们想获取Android版本号,可以直接调用Build.VERSION.SDK_INT来获取。

    二、另外还有些属性可以通过System.getProperty(“xxx”)来获取:

    os.version // OS版本号
    os.name // OS名称
    os.arch // OS架构
    user.home //home属性
    user.name // name属性
    user.dir //dir属性
    user.timezone //时区
    path.separator //路径分隔符
    line.separator // 行文分隔符
    file.separator //文件分隔符
    Java.vendor.url // Java vender URL属性
    java.class.path // Java Class路径
    java.class.version // Java class版本
    java.vendor // java vender 属性
    java.version // Java 版本
    java.home // Java Home 属性

    比如System.getProperty(“os.name”)得到的结果为“Linux”。

    三、获取厂商特有属性

    比如我们想获取华为手机的EMUI版本号,获取小米手机的MIUI版本号,可以通过如下方式:
    方法1:

    public static String getSystemProperty(String propName) {
        String line;
        BufferedReader input = null;
        try {
            Process p = Runtime.getRuntime().exec("getprop " + propName);
            input = new BufferedReader(new InputStreamReader(p.getInputStream()), 1024);
            line = input.readLine();
            input.close();
        } catch (IOException ex) {
            return null;
        } finally {
            if (input != null) {
                try {
                    input.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
        return line;
    }

    比如获取miui版本号,miui版本号的属性名称为“ro.miui.ui.version.code”,所以通过getSystemProperty(“ro.miui.ui.version.code”)就可以得到,结果例如。

    方法2:通过反射的方法获取

        public static String getProp(String propName) {
            Class<?> classType = null;
            String buildVersion = null;
            try {
                classType = Class.forName("android.os.SystemProperties");
                Method getMethod = classType.getDeclaredMethod("get", new Class<?>[]{String.class});
                buildVersion = (String) getMethod.invoke(classType, new Object[]{propName});
            } catch (Exception e) {
                e.printStackTrace();
            }
            return buildVersion;
        }

    华为的EMUI的版本号属性名称为”ro.build.version.emui”,因此调用getProp(“ro.build.version.emui”)就可以显示EMUI版本号,结果例如“EmotionUI_4.1”。

    以上内容参考自:
    https://www.jianshu.com/p/dacf0faf1033
    https://blog.csdn.net/devilkin64/article/details/19415717
    https://www.cnblogs.com/yjing/p/6654019.html

    展开全文
  • Qt 之属性系统

    万次阅读 多人点赞 2016-07-25 16:35:32
    简述Qt提供一个类似于其它编译器供应商提供的复杂的属性系统(Property System)。然而,作为一个编译器和平台无关的库,Qt不能够依赖于那些非标准的编译器特性,比如:__property或者[property]。Qt的解决方案适用...

    简述

    Qt提供一个类似于其它编译器供应商提供的复杂属性系统(Property System)。然而,作为一个编译器和平台无关的库,Qt不能够依赖于那些非标准的编译器特性,比如:__property或者[property]。Qt的解决方案适用于Qt支持平台下的任何标准C++编译器。它依赖于元对象系统(Meta Object Sytstem) - 通过信号和槽提供对象间通讯机制。

    | 版权声明:一去、二三里,未经博主允许不得转载。

    声明属性的要求

    要声明一个属性,在继承QObject的类中使用Q_PROPERTY()宏。

    Q_PROPERTY(type name
               (READ getFunction [WRITE setFunction] |
                MEMBER memberName [(READ getFunction | WRITE setFunction)])
               [RESET resetFunction]
               [NOTIFY notifySignal]
               [REVISION int]
               [DESIGNABLE bool]
               [SCRIPTABLE bool]
               [STORED bool]
               [USER bool]
               [CONSTANT]
               [FINAL])

    以下是摘自QWidget类的典型属性声明:

    Q_PROPERTY(bool focus READ hasFocus)
    Q_PROPERTY(bool enabled READ isEnabled WRITE setEnabled)
    Q_PROPERTY(QCursor cursor READ cursor WRITE setCursor RESET unsetCursor)

    下面的示例,展示了如何使用MEMBER关键字将类成员变量导出为Qt属性。注意:NOTIFY信号必须被指定,这样才能被QML使用。

        Q_PROPERTY(QColor color MEMBER m_color NOTIFY colorChanged)
        Q_PROPERTY(qreal spacing MEMBER m_spacing NOTIFY spacingChanged)
        Q_PROPERTY(QString text MEMBER m_text NOTIFY textChanged)
        ...
    signals:
        void colorChanged();
        void spacingChanged();
        void textChanged(const QString &newText);
    
    private:
        QColor  m_color;
        qreal   m_spacing;
        QString m_text;

    一个属性的行为就像一个类的数据成员,但它有通过元对象系统访问的附加功能。

    • 如果MEMBER关键字没有被指定,则一个READ访问函数是必须的。它被用来读取属性值。理想的情况下,一个const函数用于此目的,并且它必须返回的是属性类型或const引用。比如:QWidget::focus是一个只读属性,通过READ函数QWidget::hasFocus()访问。

    • 一个WRITE访问函数是可选的,用于设置属性的值。它必须返回void并且只能接受一个参数,属性的类型是类型指针或引用,例如:QWidget::enabled具有WRITE函数QWidget::setEnabled()。只读属性不需要WRITE函数,例如:QWidget::focus没有WRITE函数。

    • 如果READ访问函数没有被指定,则MEMBER变量关联是必须的。这使得给定的成员变量可读和可写,而不需要创建READ和WRITE访问函数。如果需要控制变量访问,仍然可以使用READ和WRITE函数而不仅仅是MEMBER(但别同时使用)。

    • 一个RESET函数是可选的,用于将属性设置为上下文指定的默认值。例如:QWidget::cursor有READ和WRITE函数QWidget::cursor()和QWidget::setCursor(),同时也有一个RESET函数QWidget::unsetCursor(),因为没有可用的QWidget::setCursor()调用可以确定的将cursor属性重置为上下文默认的值。RESET函数必须返回void类型,并且不带任何参数。

    • 一个NOTIFY信号是可选的。如果定义了NOTIFY,则需要在类中指定一个已存在的信号,该信号在属性值发生改变时发射。与MEMBER变量相关的NOTIFY信号必须有零个或一个参数,而且必须与属性的类型相同。参数保存的是属性的新值。NOTIFY信号应该仅当属性值真正的发生变化时发射,以避免被QML重新评估。例如:当需要一个没有显式setter的MEMBER属性时,Qt会自动发射信号。

    • 一个REVISION数字是可选的。如果包含了该关键字,它定义了属性并且通知信号被特定版本的API使用(通常是QML);如果没有包含,它默认为0。

    • DESIGNABLE属性指定了该属性在GUI设计器(例如:Qt Designer)里的编辑器中是否可见。大多数的属性是DESIGNABLE (默认为true)。除了true或false,你还可以指定boolean成员函数。

    • SCRIPTABLE属性表明这个属性是否可以被一个脚本引擎操作(默认是true)。除了true或false,你还可以指定boolean成员函数。

    • STORED属性表明了该属性是否是独立存在的还是依赖于其它属性。它也表明在保存对象状态时,是否必须保存此属性的值。大多数属性是STORED(默认为true)。但是例如:QWidget::minmunWidth()的STROED为false,因为它的值从QWidget::minimumSize()(类型为QSize)中的width部分取得。

    • USER属性指定了属性是否被设计为用户可见和可编辑的。通常情况下,每一个类只有一个USER属性(默认为false)。例如: QAbstractButton::checked是(checkable)buttons的用户可修改属性。注意:QItemDelegate获取和设置widget的USER属性。

    • CONSTANT属性的出现表明属性是一个常量值。对于给定的object实例,常量属性的READ函数在每次被调用时必须返回相同的值。对于不同的object实例该常量值可能会不同。一个常量属性不能具有WRITE函数或NOYIFY信号。

    • FINAL属性的出现表明属性不能被派生类所重写。有些情况下,这可以用于效率优化,但不能被moc强制执行。必须注意不能覆盖一个FINAL属性。

    属性类型可以是QVariant支持的任何类型,或者是用户定义的类型。在这个例子中,类QDate被看作是一个用户定义的类型。

    Q_PROPERTY(QDate date READ getDate WRITE setDate)

    因为QDate是用户自定义的,当声明属性时,必须包含<QDate>头文件。

    对于QMap、QList和QValueList属性,属性的值是一个QVariant,它包含整个list或map。注意:Q_PROPERTY字符串不能包含逗号,因为逗号会分割宏的参数。因此,你必须使用QMap作为属性的类型而不是QMap<QString,QVariant>。为了保持一致性,也需要用QList和QValueList而不是QList<QVariant>QValueList<QVariant>

    通过元数据对象系统读写属性

    一个属性可以使用常规函数QObject::property()和QObject::setProperty()进行读写,除了属性的名字,不用知道属性所在类的任何细节。下面的代码中,调用QAbstractButton::setDown()和QObject::setProperty()来设置属性“down”。

    QPushButton *button = new QPushButton;
    QObject *object = button;
    
    button->setDown(true);
    object->setProperty("down", true);

    通过WRITE操作器来设置属性值比上述两者都好,因为它效率更高而且在编译时期有更好的诊断。但是这需要你在编译实际了解整个类(能够访问其定义)。通过名称访问属性,能够让你在编译时访问不了解的类。你可以在运行时期通过QObject、QMetaObject和QMetaProperties查询类属性。

    QObject *object = ...
    const QMetaObject *metaobject = object->metaObject();
    int count = metaobject->propertyCount();
    for (int i=0; i<count; ++i) {
        QMetaProperty metaproperty = metaobject->property(i);
        const char *name = metaproperty.name();
        QVariant value = object->property(name);
        ...
    }

    上面的代码片段中,QMetaObject::property()用于获取未知类中每个属性的metadata。从metadata中获取属性名,然后传给QObject::property()来获取当前对象的属性值。

    一个简单的示例

    假设我们有一个类MyClass,它从QObject派生并且在其private区域使用了Q_OBJECT宏。我们想在MyClass类中声明一个属性来追踪一个priority值。属性的名称是priority,它的类型是定义在MyClass中的Priority枚举。

    我们在类的private区域使用Q_PROPERTY()来声明属性。READ函数名为priority,并且我们包含一个名为setPriority的WRITE函数,枚举类型必须使用Q_ENUM()注册到元对象系统中。注册一个枚举类型使得枚举的名字可以在调用QObject::setProperty()时使用。我们还必须为READ和WRITE函数提供我们自己的声明。

    MyClass的声明看起来应该是这样的:

    class MyClass : public QObject
    {
        Q_OBJECT
        Q_PROPERTY(Priority priority READ priority WRITE setPriority NOTIFY priorityChanged)
    
    public:
        MyClass(QObject *parent = 0);
        ~MyClass();
    
        enum Priority { High, Low, VeryHigh, VeryLow };
        Q_ENUM(Priority)
    
        void setPriority(Priority priority)
        {
            m_priority = priority;
            emit priorityChanged(priority);
        }
        Priority priority() const
        { return m_priority; }
    
    signals:
        void priorityChanged(Priority);
    
    private:
        Priority m_priority;
    };

    READ函数是const的并且返回属性的类型。WRITE函数返回void并且具有一个属性类型的参数。元对象编译器强制做这些事情。

    给定一个指向MyClass实例的指针,或一个指向QObject(MyClass实例)的指针时,我们有两种方法来设置priority属性:

    MyClass *myinstance = new MyClass;
    QObject *object = myinstance;
    
    myinstance->setPriority(MyClass::VeryHigh);
    object->setProperty("priority", "VeryHigh");

    在此例子中,定义在MyClass中的枚举类型是属性的类型,而且被Q_ENUM()宏注册在元对象系统中。这使得枚举值可以在调用setProperty()时做为字符串使用。如果枚举类型在其它类中声明,那么需要使用枚举的全名(例如:OtherClass::Priority),而且这个类也必须从QObject派生,并且使用Q_ENUM()宏注册枚举类型。

    另一个简单的宏Q_FLAGS()也是可用的,就像Q_ENUMS(),它注册一个枚举类型,但是它把枚举类型作为一个flag集合,也就是,值可以用OR操作来合并。一个I/O类可能具有枚举值Read和Write并且QObject::setProperty()可以接受Read | Write。应使用Q_FLAGS()来注册此枚举类型。

    动态属性

    QObject::setProperty()也可以用来在运行时期向一个类的实例添加新的属性。当使用一个名字和值调用它时,如果QObject中一个指定名称的属性已经存在,并且如果给定的值与属性的类型兼容,那么,值就被存储到属性中,然后返回true。如果值与属性类型不兼容,属性的值就不会发生改变,会返回false。但是如果QObject中一个指定名称的属性不存在(例如:未用Q_PROPERTY()声明),一个带有指定名称和值的新属性就被自动添加到QObject中,但是依然会返回false。这意味着返回值不能用于确定一个属性是否被设置值,除非事先知道这个属性已经存在于QObject中。

    注意:态属性被添加到每一个实例中,即:它们被添加到QObject中,而不是QMetaObject。一个属性可以从一个实例中删除,通过传入属性名和非法的QVariant值给QObject::setProperty()。默认的QVariant构造器会构造一个非法的QVariant。

    动态属性可用QObject::property()来查询,就像使用Q_PROPERTY()声明的属性一样。

    属性和自定义类型

    被属性使用的自定义类型需要使用Q_DECLARE_METATYPE()宏注册,以便它们的值能被保存在QVariant对象中。这使得它们适用于在类定义时使用Q_PROPERTY()宏声明的静态属性,以及运行时创建的动态属性。

    为类添加附加信息

    与属性系统相对应的是一个附加宏 - Q_CLASSINFO()。用于添加name-value对到类的元对象中。例如:

    Q_CLASSINFO("Version", "3.0.0")

    和其它meta-data一样,类信息可以在运行时通过meta-object访问,详情见:QMetaObject::classInfo() 。

    展开全文
  • Qt属性系统详解

    千次阅读 2014-04-05 14:42:57
    Qt提供了一个绝妙的属性系统。跟那些由编译器提供的属性差不多。然而,作为一个独立于编译器和平台的库,Qt不依赖于非标准的编译特性,比如__property 或[property]。Qt可以在任何平台上的标准编译器下编译。Qt属性...

    Qt提供了一个绝妙的属性系统。跟那些由编译器提供的属性差不多。然而,作为一个独立于编译器和平台的库,Qt不依赖于非标准的编译特性,比如__property 或[property]。Qt可以在任何平台上的标准编译器下编译。Qt属性系统基于元数据对象系统--就是那个提供了对象内置信号和槽通讯机制的家伙。


    声明属性需要什么


    要声明一个属性,需在继承自QObject的类中使用Q_PROPERTY()宏。
    Q_PROPERTY(type name
       READ getFunction
       [WRITE setFunction]
       [RESET resetFunction]
       [NOTIFY notifySignal]
       [DESIGNABLE bool]
       [SCRIPTABLE bool]
       [STORED bool]
       [USER bool]
       [CONSTANT]
       [FINAL])

    下面是一些典型的声明属性的示例:

    [cpp]  view plain copy
    1. Q_PROPERTY(bool focus READ hasFocus)  
    2. Q_PROPERTY(bool enabled READ isEnabled WRITE setEnabled)  
    3. Q_PROPERTY(QCursor cursor READ cursor WRITE setCursor RESET unsetCursor)  

    • 一个属性的行为就像类的数据成员,但是它还具有附加的特性,这些特性可以被元数据对象系统操作。这些特性是:
      需要一个READ访问器函数。用于读属性的值。理想情况下,有一个不变的函数用于此目的,并且它必须返回属性的类型的值或指针或引用。例如,QWidget::focus是一个只读的属性,它对应一个读函数:QWidget::hasFocus()。
    • 一个可选的WRITE访问器函数。它用于设置属性的值。它必须返回空并且至少具有一个参数,参数是属性类型的值或指针或引用。例如:QWidget::enabled具有WRITE函数QWidget::setEnable()。只读属性不需要写函数。例如,QWidget::focus没有对应的写函数。
    • 一个可选的RESET函数。用于设置属性的值到它的默认值。例如:QWidget::cursor具有典型的READ和WRITE函数,QWidget::cursor()和QWidget::setCursor(),并且它也具有一个RESET函数,QWidget::unsetCursor()。RESET函数必须返回void并且不带有任何参数。
    • 一个可选的NOTIFY信号。如果被定义了,信号将在属性的值改变时发出。信号必须带有一个参数,这个参数的类型必须与属性相同;参数保存的是属性的新值。
    • 一个DESIGNABLE变量表明此属性是否在界面设计器的属性编辑器中出现。大多数属性是可见的,除了为这个变量传入true或false,你还可以指定一个bool型的成员函数。
    • SCRIPTABLE变量表明这个属性是否可以被一个脚本引擎操作(默认是true)。你也可以赋予它true或false或bool型函数。
    • STORED变量表明了属性是否被认为是独立存在还是依赖于其它的值而存在。它也表明是否在保存对象状态时保存此属性的值。大多数属性都是需要保存的,但是,如QWidget::minimumWidth()就是不被保存的,因为它的值是从另一个属性QWidget::minimumSize()得来的。
    • USER变量表明属性是否被设计为面向用户的或用户可修改的类属性。通常,每个类只有一个USER属性。例如,QAbstractButton::checked是按钮类的用户可修改属性。注意QItemDelegate获取和设置widget的USER属性。
    • CONSTANT的出现表明属性的值是不变的。对于一个object实例,常量属性的READ方法在每次被调用时必须返回相同的值。此常量值可能在不同的object实例中不相同。一个常量属性不能具有WRITE方法或NOYIFY信号。
    • FINAL变量的出现表明属性不能被派生类所重写。有些情况下,这可以用于效率优化,但不是被moc强制的。程序员必须永远注意不能重写一个FINAL属性。

    READ,WRITE和RESET函数都可以被继承。它们也可以是虚函数。当它们在被多重继承中被继承时,它们必须出现在第一个被继承的类中。

    属性的类型可以是被QVariant支持的所有类型,也可以是用户定义的类型。在下面的例子中,类QDate被当作用户自定义类型。
    Q_PROPERTY(QDate data READ getDate WRITE setDate)
    因为QDate是用户定义的,你必须包含<QDate>头文件。

    对于QMap,QList和QValueList属性,属性的值是一个QVariant,它包含整个list或map。注意Q_PROPERTY字符串不能包含逗号,因为逗号会划分宏的参数。因此,你必须使用QMap作为属性的类型而不是QMap<QString,QVariant>。为了保持一致性,也需要用QList和QValueList而不是QList<QVariant>和QValueList<QVariant>。


    通过元数据对象系统读写属性

    一个属性可以使用常规函数QObject::property()和QObject::setProperty()进行读写,不用知道属性所在类的任何细节,除了属性的名字。在下面的小代码片段中,调用QAbstractButton::setDown()和QObject::setProperty()都把属性设置为“down”。

    [cpp]  view plain copy
    1. QPushButton *button = new QPushButton;  
    2. QObject *object = button;  
    3. button->setDown(true);  
    4. object->setProperty("down"true);  

    通过WRITE操作器来操作一个属性是上面两者中更好的,因为它快并且在编译时给于更好的诊断帮助,但是以这种方式设置属性要求你必须在编译时了解其类。通过名字来操作属性使你可以操作在编译器你不了解的类。你可以在运行时发现一个类的属性们,通过查询它的QObject,QMetaObject和QMetaProerties。

    [cpp]  view plain copy
    1. QObject *object = ...  
    2. const QMetaObject *metaobject = object->metaObject();  
    3. int count = metaobject->propertyCount();  
    4. for (int i=0; i<count; ++i) {  
    5.     QMetaProperty metaproperty = metaobject->property(i);  
    6.     const char *name = metaproperty.name();  
    7.     QVariant value = object->property(name);  
    8.     ...  
    9. }  

    在上面的代码片段中,QMetaObject::property()被用于获取未知类中的属性的metadata。从metadata中获取属性名然后传给QObject::property()来获取

    一个简单例子


    假设我们有一个类MyClass,它从QObject派生并且在它的private区使用 了Q_OBJECT宏。我们想在MyClass类中声明一个属性来持续追踪一个Priorty值。属性的值叫做priority,并且它的类型是一个在类MyClass中定义的叫做Priority的枚举。

    我们在类的private区使用Q_PROPERTY()来声明属性。READ函数叫做priority,并且我们包含一个WRITE函数叫做setPriority。枚举类型必须使用Q_ENUMS()注册到元数据对象系统中。注册一个枚举类型使得枚举的名字可以在调用QObject::setProperty()时使用。我们还必须为READ和WRITE函数提供我们自己的声明。MyClass的声明看起来应该是这样的:

    [cpp]  view plain copy
    1. class MyClass : public QObject  
    2. {  
    3.     Q_OBJECT  
    4.     Q_PROPERTY(Priority priority READ priority WRITE setPriority)  
    5.     Q_ENUMS(Priority)  
    6. public:  
    7.     MyClass(QObject *parent = 0);  
    8.     ~MyClass();  
    9.     enum Priority { High, Low, VeryHigh, VeryLow };  
    10.     void setPriority(Priority priority);  
    11.     Priority priority() const;  
    12. };  

    READ函数是const的并且返回属性的类型。WRITE函数返回void并且具有一个属性类型的参数。元数据对象编译器强制做这些事情。

    在有了一个指向MyClass实例的指针时,我们有两种方法来设置priority属性:

    [cpp]  view plain copy
    1. MyClass *myinstance = new MyClass;  
    2.  QObject *object = myinstance;  
    3.  myinstance->setPriority(MyClass::VeryHigh);  
    4.  object->setProperty("priority""VeryHigh");  

    在此例子中,枚举类型在MyClass中声明并被使用Q_ENUMS()注册到元数据对象系统中。这使得枚举值可以在调用setProperty()时做为字符串使用。如果枚举类型是在其它类中声明的,那么我们就需要用枚举的全名(如OtherClass::Priority),并且这个其它类也必须从QObject中派生并且也要注册枚举类型。
    另一个简单的Q_FLAGS()也是可用的。就像Q_ENUMS(),它注册一个枚举类型,但是它把枚举类型作为一个flag的集合,也就是,值可以用OR操作来合并。一个I/O类可能具有枚举值Read和Write并且QObject::setProperty()可以接受 Read|Write。此时应使用Q_FLAGS()来注册枚举值。

    动态属性

    Qobject::setProperty()也可以用来在运行时向一个类的实例添加新的属性。当使用一个名字和值调用它时,如果一个对应的属性已经存在,并且如果值的类型与属性的类型兼容,那么值就被存储到属性中,然后返回true。如果值类型不兼容,属性的值就不会发生改变,就会返回false。但是如果对应名字的属性不存在,那么一个新的属性就诞生了,以传入的名字为名,以传入的值为值,但是依然会返回false。这表示返回值不能用于确定一个属性是否被设置值,除非你已经知道这个属性已经存在于QObject中了。
    注意动态属性被添加到单个实现的基础中,也就是,被添加到QObject,而不是QMetaObject。一个属性可以从一个实例中删除,通过传入属性的名字和非法的QVariant值给QObject::setProperty()。默认的QVariant构造器构造一个非法的QVariant。
    动态属性可用QObject::property()来查询,就行使用Q_PROPERTY()声明的属性一样。

    属性和自定义类型

    被属性使用的自定义类型需要使用Q_DECLARE_METATYPE()宏注册,以使它们的值能被保存在QVariant对象中。这使得它们可以用于被Q_PROPERTY()声明的静态类型中,也可以被用于动态类型中。

    展开全文
  • springboot属性动态配置

    千次阅读 2019-10-29 15:00:16
    /** * @Author yimocha * @Version 1.0 * springBoot 属性动态方式一 * 公有属性动态 **/ @ConfigurationProperties(prefix = "jdbc") @Data public class JdbcConfigProperties { private String url; private ...

    配置文件存放位置

    springboot默认会读取这个名字的文件,推荐命名(application.properties)
    application.properties

    jdbc.driverClassName=com.mysql.cj.jdbc.Driver
    jdbc.url=jdbc:mysql://192.168.28.217:3306/yimocha?characterEncoding=utf8&useSSL=false&serverTimezone=Asia/Shanghai&rewriteBatchedStatements=true
    jdbc.username=root
    jdbc.password=root
    

    在这里插入图片描述

    springboot属性动态方式一:

    动态的配置类

    package top.yimocha.config;
    
    import lombok.Data;
    import org.springframework.boot.context.properties.ConfigurationProperties;
    
    /**
     * @Author yimocha
     * @Version 1.0
     * springBoot 属性动态方式一
     * 公有属性动态
     **/
    @ConfigurationProperties(prefix = "jdbc")
    @Data
    public class JdbcConfigProperties {
        private String url;
        private String driverClassName;
        private String username;
        private String password;
    }
    
    

    使用类

    package top.yimocha.config;
    
    import com.alibaba.druid.pool.DruidDataSource;
    import org.springframework.beans.factory.annotation.Value;
    import org.springframework.boot.context.properties.ConfigurationProperties;
    import org.springframework.boot.context.properties.EnableConfigurationProperties;
    import org.springframework.context.annotation.Bean;
    import org.springframework.context.annotation.Configuration;
    import org.springframework.context.annotation.PropertySource;
    
    import javax.sql.DataSource;
    
    /**
     * @Author yimocha
     * @Version 1.0
     * 
     **/
    @Configuration
    @EnableConfigurationProperties(JdbcConfigProperties.class)
    public class JdbcConfig {
    
       @Bean
       public DataSource dataSource(JdbcConfigProperties properties) {
           DruidDataSource druidDataSource = new DruidDataSource();
            druidDataSource.setPassword(properties.getPassword());
           	druidDataSource.setUsername(properties.getUsername());
            druidDataSource.setUrl(properties.getUrl());
            druidDataSource.setDriverClassName(properties.getDriverClassName());
            return druidDataSource;
        }
    
    }
    
    

    这种方式适合配置全局属性动态,需要在整个应用使用

    springboot属性动态方式二:

    使用类

    package top.yimocha.config;
    
    import com.alibaba.druid.pool.DruidDataSource;
    import org.springframework.beans.factory.annotation.Value;
    import org.springframework.boot.context.properties.ConfigurationProperties;
    import org.springframework.boot.context.properties.EnableConfigurationProperties;
    import org.springframework.context.annotation.Bean;
    import org.springframework.context.annotation.Configuration;
    import org.springframework.context.annotation.PropertySource;
    
    import javax.sql.DataSource;
    
    /**
     * @Author yimocha
     * @Date 2019/10/28 18:29
     * @Version 1.0
     * 属性动态java 的属性动态方式
     **/
    @Configuration
    public class JdbcConfig {
    
        @ConfigurationProperties(prefix = "jdbc")
        @Bean
        public DataSource dataSource() {
            return new DruidDataSource();
        }
    }
    
    

    只在本类使用,不涉及整个程序的互用

    展开全文
  • Java 类动态添加属性字段

    万次阅读 2018-10-22 18:35:11
    说明:做项目中遇到一种场景,需要根据... 但是当前系统中easyUI版本为1.2,并不支持 data属性(官方从1.3.2开始支持)。所以只能返回list&lt;T&gt; 格式。 网上一搜相关代码很多, 看客可以自己搜索一下。...
  • 1、根据环境变量env设置 <- 可以根据System.getenv("LogHomeRoot")获取的环境变量,可以...- 可以根据System.getProperty("LogHomeRoot")获取的系统属性,可以直接通过以下方式设置 -> <property name="L
  • 属性系统是android的一个重要特性。它作为一个服务运行,管理系统配置和状态。所有这些配置和状态都是属性。 1 2 每个属性是一个键值对(key/value pair),其类型都是字符串。 这些属性可能是有些资源的...
  • Android 如何添加系统属性

    千次阅读 2018-10-11 17:45:52
    属性值是可以动态增加动态生效的;2. 动态添加后,重启手机,还是有效的;3. boolean 型的值,在命令行中,是可以直接用1 或者0 来定义的。 随后,顺便从网络上学习了如下内容: =============================...
  • iOS runtime ~ 动态添加属性

    千次阅读 2017-12-30 09:28:54
    联系人:石虎 QQ:1224614774 昵称: 嗡嘛呢叭咪哄  QQ群:807236138 群称: iOS 技术交流学习群 ...开发场景:给系统的类添加属性的时候,可以使用runtime动态添加属性方法;  3.本质:动态添加属性,就是...
  • 比如说做商品系统,商品有多种属性,不同类型的商品的属性不一样,怎么用关系型数据库去保存这些不同的属性呢?再比如做CMS时,除了基本的背景、位置、类型、状态等属性一致外,页面不同地方需要的数据结构却是不...
  • 最近做了一个系统,使用Elasticsearch做了全文搜索,系统分为开发环境和正式环境,正式环境供公司内部使用,因为服务器资源不太充裕,决定开发环境和正式环境共用一个Elasticsearch,不同环境仅以索引名称(indexName...
  • 动态添加class属性

    千次阅读 2016-04-07 09:13:21
    使用JQuery为JS动态添加的div块添加class属性
  • Kanzi学习之路(4):Kanzi的属性系统

    千次阅读 2017-02-04 23:13:30
    由于中间隔了一个年假,所以这两周都没有更新,今天来一起学习一下kanzi的属系统。 从前面的学习中,我们也接触到了kanzi一些节点的属性,比如在Scene下新建一个3D的正方体,我们左键选中这个节点,就会在右边的...
  • 1.动态添加方法 应用场景:如果一个类方法非常多,加载类到内存的时候也比较耗费资源,需要给每个方法生成映射表,可以使用动态给某个类,添加方法解决。 注解:OC 中我们很习惯的会用懒加载,当用到的时候才去...
  • // 动态的添加了一个属性 this.info.abc = 'haha' } } }); 记得:引入 vue.js文件 这是第一次执行的结果:第一次具备响应能力。 第二次 我在控制台修改 数据 第三次: 再次修改数据 总结: ...
  • Swift给系统的类扩展属性

    千次阅读 2017-03-15 15:25:12
    OC的类别和扩展一般用来给类扩展方法,但有时我们需要给系统的类加一个额外的属性,这需要用到runtime机制。 Runtime是一套底层的C语言API(包含强大的C语言数据类型和函数)OC代码都是基于Runtime实现的,即编写的...
  • 在做这个项目的时候遇到了一个问题,数据库中的user的属性没有年龄的这个字段,只有一个date的日期属性(即生日),而前端的页面显示的生日所对应的当前的年龄,是一个动态值,要根据生日和当前的时间计算出,然后传...
  • 用对应id的控件,动态添加 子控件 for (var i = 0; i < facechatdata.length; i++) { if (rownames == [] || rownames == undefined) { $("#checkoutboxs").append("<...
  • QT 属性系统

    千次阅读 2017-04-09 13:21:25
    最近学习了python 的描述器,想起之前学过的Qt 的属性系统,特此过来记录一下。 Qt的属性系统需要借助元对象来实现: Q_PROPERTY(type name  READ getFunction  [WRITE setFunction]  [RESET resetFunction...
  • 属性加密技术及基于属性的访问控制技术

    千次阅读 多人点赞 2020-04-07 13:37:10
    一、属性加密技术... 1 1.1基于身份的加密体制简介... 1 1.2基于属性的加密体制的研究背景和意义... 1 1.3基于属性加密的研究现状... 2 二、基于属性的访问控制技术... 5 2.1基于属性的访问控制介绍... 5 2.2...
  • AndroidManifest.xml文件部分属性配置解析,以及如何在代码中获取指定配置值。 package="com.jiese.test" android:versionCode="1" android:versionName="1.0" > android:debuggable="fal
  • 中小型商城系统中的分类/产品属性/扩展属性的数据库设计  正文:  之前发表过一篇"商城系统中【商品扩展属性】的表单生成及客户端验证",部分童鞋对于后台数据库的设计比较感兴趣,于是今天把这部分也补上...
  • Android 系统属性SystemProperty分析

    万次阅读 2013-05-16 19:10:13
    属性变更的请求时init事件循环处理的另一个事件,在Android平台中,为了让运行中的所有进程共享系统运行时所需要的各种设置值,系统开辟了属性存储区域,并提供了访问该区域的API。属性由键(key)与值(value)构成,其...
  • Java反射获取Android系统属性

    千次阅读 2015-04-29 16:20:59
    目录目录 反射定义 为何需要反射 反射方法Method getDeclaredMethod方法 getMethod方法 参数解释 invoke方法 Android 反射应用 ...动态构造某个类的对象。 检测类的属性和方法。 任意调用对象的方法。 修改构造函
  • 获取设备的系统属性

    千次阅读 2014-06-27 16:18:09
    这些属性多数是开机启动时预先设定的,也有一些是动态加载的。 系统启动时以下面的次序加载预先设定属性: /default.prop /system/build.prop /system/default.prop /data/local.prop ...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 631,470
精华内容 252,588
关键字:

动态属性系统