当前位置: 首页 > news >正文

手机版的网站开发sem推广代运营

手机版的网站开发,sem推广代运营,公司网站域名到期,新网域名注册续费Qt元对象系统(QMetaObject) Qt 的元对象系统叫 Meta-Object-System#xff0c;提供了对象之间通信的信号与槽机制、运行时类型信息和动态属性系统。即使编译器不支持RTTI#xff08;RTTI的实现耗费了很大的时间和存储空间#xff0c;这就会降低程序的性能#xff09;…Qt元对象系统(QMetaObject) Qt 的元对象系统叫 Meta-Object-System提供了对象之间通信的信号与槽机制、运行时类型信息和动态属性系统。即使编译器不支持RTTIRTTI的实现耗费了很大的时间和存储空间这就会降低程序的性能我们也能动态获取类型信息。 元对象实质上是对类的描述 但是元对象是基于三个条件的 1、该类必须继承自QObject类 2、必须在类的私有声明区声明Q_OBJECT宏在类定义的时候如果没有指定public 则默认为private用来启用元对象功能比如动态属性、信号和槽。 3、 元对象编译器Meta-Object Compilermoc为 QObject的子类实现元对象 特性提供必要的代码。 有了元对象系统后我们就可以使用Qt的信号和槽了。 moc(Meta-Object Compiler)元对象预编译器。 moc读取一个c头文件。如果它找到包含Q_OBJECT宏的一个或多个类声明它会生成一个包含这些类的元对象代码的c源文件并且以moc_作为前缀。 信号和槽机制、运行时类型信息和动态属性系统需要元对象代码。 由moc生成的c源文件必须编译并与类的实现联系起来。通常moc不是手工调用的而是由构建系统自动调用的。 获取类关联的元对象的函数是metaObject QMetaObject  *mtobj QObject::metaObject() 如 QPushButton *btnnew QPushButton(); const QMetaObject *metaPtrbtn-metaObject();        //获取元对象指针 常用的函数 1函数QMetaObject::className()该函数运行时返回类名称的字符串 2函数QObjetc::inhetits()。可以判断一个对象是不是继承自某个类的实例。顶层的父类是QObject 3函数QMetaObject::superClass()。用来返回该元对象所描述类的父类的元对象通过父类的元对象可以获取父类的一些元数据 4函数qobject_cast(): 对于Object及其子类对象可以使用函数qobject_cast()进行动态类型转换此处可以理解为c中的强制类型转换 属性系统Q_PROPERTY 在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]) Q_PROPERTY()宏定义一个返回值类型为type名称为name的属性。属性的类型可以是QVarient支持的任何类型 C标准类型、类名、结构体、枚举等也可以用户自定义类型。 READ用于读取属性值。 WRITE写访问器函数是可选的。用于设置属性值。它必须返回void并且必须只接受一个参数要么是属性的类型要么是指向该类型的指针或引用。 MEMBER如果未指定读取访问器函数则需要成员变量关联。这使得给定的成员变量可读写而无需创建读写访问器函数。使用MEMBER可以替代READ、WRITE。 RESET复位功能是可选的。它用于将属性设置回其特定于上下文的默认值。 NOTIFY通知信号是可选的。如果已定义它应该指定该类中的一个现有信号该信号在属性值更改时发出。 定义属性 头文件#ifndef COLORMAKER_H#define COLORMAKER_H#include QObjectclass CTest{public:CTest(){}int nAge;QString strName;};Q_DECLARE_METATYPE(CTest)class ColorMaker : public QObject{Q_OBJECTpublic:explicit ColorMaker(QObject *parent nullptr);~ColorMaker();Q_PROPERTY(int value READ getvalue WRITE setvalue NOTIFY valueChanged);Q_PROPERTY(CTest test READ gettest WRITE settest NOTIFY testChanged);//使用自定义的类int getvalue() const;void setvalue(const int value);CTest gettest() const;void settest(const CTest test);signals:void valueChanged(int value);void testChanged(CTest test);private:int m_value;CTest m_test;};#endif // COLORMAKER_H源文件#include ColorMaker.hColorMaker::ColorMaker(QObject *parent){}ColorMaker::~ColorMaker(){}int ColorMaker::getvalue() const{return m_value;}void ColorMaker::setvalue(const int value){m_value value;emit valueChanged(m_value);}CTest ColorMaker::gettest() const{return m_test;}void ColorMaker::settest(const CTest test){m_test test;emit testChanged(m_test);} 使用属性 属性的读写既可以使用各个属性自己的读写函数,也可以使用属性通用的函数setProperty() 写属性property() 读属性都是通过属性的名称来寻找特定属性实现读写。 bool setProperty(const char *name, const QVariant value); QVariant property(const char *name) const; setProperty() 第一个参数是普通字符串就是属性的名称第二个参数是属性的数值。QVariant 是 Qt 定义的通用变量类型标准 C 的类型和 Qt 自己的数值类型都可以自动转为 QVariant 类的对象。 int propertyCount() const; 通过元对象获取属性的个数 QMetaProperty property(int index) const; 获取属性 QMetaProperty 的const char *name() const; 获取属性名 例子 #ifndef WIDGET_H#define WIDGET_H#include QWidget#include ColorMaker.hQT_BEGIN_NAMESPACEnamespace Ui { class Widget; }QT_END_NAMESPACEclass Widget : public QWidget{Q_OBJECTpublic:Widget(QWidget *parent nullptr);~Widget();public slots:void recv(int nval);void recvtest(CTest test);private:Ui::Widget *ui;};#endif // WIDGET_H源文件#include widget.h#include ui_widget.h#include QDebug#include QMetaPropertyWidget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget){ui-setupUi(this);ColorMaker *cm new ColorMaker();connect(cm,ColorMaker::valueChanged,this,Widget::recv);connect(cm,ColorMaker::testChanged,this,Widget::recvtest);cm-setvalue(1);int value cm-getvalue();cm-setProperty(value, 2);value cm-property(value).toInt();CTest test;test.nAge 2;test.strName qq;cm-setProperty(test,QVariant::fromValue(test));CTest test1 qvariant_castCTest(cm-property(test));QObject *object   cm;const QMetaObject *metaobject object-metaObject();int ncount metaobject-propertyCount();for (int i 0; i ncount; i){QMetaProperty metaproperty metaobject-property(i);const char *name metaproperty.name();qDebug() name;QVariant value object-property(name);qDebug() value;}CTest s;s.nAge 1;s.strName hello;QVariant varTest;varTest.setValue(s);QVariant var QVariant::fromValue(s);bool b var.canConvertCTest();if(b){CTest test var.valueCTest();CTest test1 qvariant_castCTest(var);qDebug() test.nAge;qDebug() test.strName;}}Widget::~Widget(){delete ui;}void Widget::recv(int nval){int a nval;qDebug() a;}void Widget::recvtest(CTest test){qDebug() test.nAge;qDebug() test.strName;} 作用 属性系统提供了可以像操作普通的数据成员一样操作这些自定义属性的方法同时也可以利用Qt的信号槽系统来监听属性值的变化。 使用场景 Q_PROPERTY用于c类注册到qml交互上。在c的变化发送信号而在qml上接收信号实现处理槽函数。这个使用于qml导出到c类c类获取和设置qml的属性。自定义qt designer 插件 在ui上可以直接看到并设置属性值、信号槽。 延伸 Q_DECLARE_METATYPE Q_DECLARE_METATYPE(Type)向Qt元系统注册一些非基本类型。Type可以是自定义类、结构体、枚举。一旦注册后在Qt元系统中就可以很方便的利用这些非基本类型。 如果Type在命名空间中Q_DECLARE_METATYPE()必须在命名空间外部。 定义 class CTest { public: CTest(){} int nAge; QString strName; }; //或者 //struct CTest //{ //    int nAge; //    QString strName; //}; Q_DECLARE_METATYPE(CTest) 使用 设置函数 QVariant::setValue或者 QVariant fromValue 获取函数 Value 或者 QVariant fromValue CTest s; s.nAge 1; s.strName hello; QVariant varTest; varTest.setValue(s); QVariant var QVariant::fromValue(s); bool b var.canConvertCTest(); if(b) { CTest test var.valueCTest(); CTest test1 qvariant_castCTest(var); qDebug() test.nAge; qDebug() test.strName; } 枚举常用宏 Q_ENUM 作用宏Q_ENUM会向元对象系统注册一个枚举类型。 使用注意事项 1.使用Q_ENUM之前必须在类中先声明Q_OBJECT或Q_GADGET宏。 2.Q_ENUM(枚举类型)必须放在枚举声明之后放在前面编译器会报错。 如注册Orientation枚举 class Widget : public QWidget { Q_OBJECT public: Widget(QWidget *parent nullptr); ~Widget(); enum Orientation { Up 1, Down 2, Left 3, Right 4 }; Q_ENUM(Orientation)  //向元对象系统注册枚举类型 public slots: void recv(int nval); void recvtest(CTest test); private: Ui::Widget *ui; }; 使用静态函数QMetaEnum::fromType()来获取QMetaEnum QMetaEnum metaEnum QMetaEnum::fromTypeWidget::Orientation(); //MyEnum是当前类Orientation是枚举的类型 QMetaEnum metaEnum QMetaEnum::fromTypeWidget::Orientation();  //通过静态函数fromType获取QMetaEnum对象 QString name metaEnum.name();                   //枚举名称 int count metaEnum.keyCount();                  //枚举数量 QString keyIndex metaEnum.key(0);               //下标为0的key int valueIndex metaEnum.value(0);               //下标为0的value QString Key metaEnum.valueToKey(Widget::Left);  //通过value得到key int value metaEnum.keyToValue(Left);          //通过key得到value qDebug() 枚举的名称 name; qDebug() 枚举的数量 QString::number(count); qDebug() index下标的key值 keyIndex; qDebug() index下标的Value值 QString::number(valueIndex);                                                                        qDebug() value对应的key值 Key; qDebug() key值对应的Vaule QString::number(value); Q_FLAG 为了解决枚举变量的组合使用增加枚举变量间与或非计算。且运算结果还是一个QFlags包装的枚举量。一个普通的枚举类型包装成QFlags型需要使用Q_DECLARE_FLAGS宏在全局任意地方使用”|操作符计算自定义的枚举量需要使用Q_DECLARE_OPERATORS_FOR_FLAGS宏。 Q_DECLARE_FLAGS()宏 Q_DECLARE_FLAGS(Flags, Enum)宏展开为 typedef QFlagsEnum  Flags; QFlagsEnum是一个模板类其中Enum是枚举类型QFlags用于存储枚举值的组合 Q_DECLARE_OPERATORS_FOR_FLAGS()宏 1.Q_DECLARE_OPERATORS_FOR_FLAGS(Flags)赋予了Flags一个全局操作符“|”没有这个宏语句Flags量之间进行与操作后的结果将是一个int值而不是Flags值。 2.Q_DECLARE_OPERATORS_FOR_FLAGS必须定义在类外。 3.Q_DECLARE_OPERATORS_FOR_FLAGS只提供了“或”操作没有提供“与”“非”操作。 例子 #ifndef WIDGET_H #define WIDGET_H #include QWidget #include ColorMaker.h QT_BEGIN_NAMESPACE namespace Ui { class Widget; } QT_END_NAMESPACE class Widget : public QWidget { Q_OBJECT public: Widget(QWidget *parent nullptr); ~Widget(); enum Orientation { Up 1, Down 2, Left 4, Right 8 }; Q_ENUM(Orientation)  //向元对象系统注册枚举类型 Q_DECLARE_FLAGS(OrientationFlag,Orientation) Q_FLAG(OrientationFlag) public slots: void recv(int nval); void recvtest(CTest test); private: Ui::Widget *ui; }; Q_DECLARE_OPERATORS_FOR_FLAGS(Widget::OrientationFlag) #endif // WIDGET_H 使用 QMetaEnum metaEnum QMetaEnum::fromTypeWidget::Orientation();  //通过静态函数fromType获取QMetaEnum对象 QString name metaEnum.name();                   //枚举名称 int count metaEnum.keyCount();                  //枚举数量 QString keyIndex metaEnum.key(0);               //下标为0的key int valueIndex metaEnum.value(0);               //下标为0的value QString Key metaEnum.valueToKey(Widget::Left);  //通过value得到key int value metaEnum.keyToValue(Left);          //通过key得到value QString Key2 metaEnum.valueToKeys(Widget::Left | Widget::Right); //通过value得到key int value2 metaEnum.keysToValue(Up | Down); qDebug() 枚举的名称 name; qDebug() 枚举的数量 QString::number(count); qDebug() index下标的key值 keyIndex;  //Up qDebug() index下标的Value值 QString::number(valueIndex);  //1 qDebug() value对应的key值 Key; //Left qDebug() value对应的key值 Key2; //Left|Right qDebug() key值对应的Vaule: QString::number(value);//4 qDebug() key值对应的Vaule: QString::number(value2);//3 QMetaObject::invokeMethod() 作用使用QMetaObject::invokeMethod()调用QObject的某个注册到元对象系统中的方法。支持跨线程调用。 一般该方法是信号、或者槽函数。无论这个方法是公有的、保护的还是私有的。 如果是普通函数则需要使用Q_INVOKABLE宏把函数注册到元对象系统。 格式 bool QMetaObjcet:invokeMethod( QObject* obj, const char* member, Qt::ConnectionType type, QGenericReturnArgument ret, QGenericReturnArgument  vla0 QGenericReturnArgument(0), QGenericReturnArgument  vla1 QGenericReturnArgument(), QGenericReturnArgument  vla2 QGenericReturnArgument(), QGenericReturnArgument  vla3 QGenericReturnArgument(), QGenericReturnArgument  vla4 QGenericReturnArgument(), QGenericReturnArgument  vla5 QGenericReturnArgument(), QGenericReturnArgument  vla6 QGenericReturnArgument(), QGenericReturnArgument  vla7 QGenericReturnArgument(), QGenericReturnArgument  vla8 QGenericReturnArgument(), QGenericReturnArgument  vla9 QGenericReturnArgument()); 返回值返回true说明调用成功返回false要么是因为没有你说的那个方法要么是参数类型不匹配 obj被调用对象的指针 member方法名字   必须是信号、槽以及Qt元对象系统能识别的类型 如果不是信号和槽可以使用qRegisterMetaType来注册数据类型。此外使用Q_INVOKABLE来声明函数也可以正确调用。 type连接类型invokeMethod为信号槽而生你可以指定连接类型如果被调用的对象和发起调用的线程是同一线程那么可以使用Qt::DirectConnection、Qt::AutoConnection、Qt::QueuedConnection如果被调用对象在另一个线程那么建议使用Qt::QueuedConnection ret接收返回值 然后就是多达10个可以传递给被调用方法的参数看来信号槽的参数个数是有限制的最好不要超过10个 QGenericArgument和QGenericReturnArgument是内部帮助程序类,由于可以动态调用信号和槽因此必须使用Q_ARG和Q_RETURN_ARG宏来封装参数 注意此功能是线程安全的。 例子 #ifndef COLORMAKER_H#define COLORMAKER_H#include QObjectclass CTest{public:CTest(){}int nAge;QString strName;};Q_DECLARE_METATYPE(CTest)class ColorMaker : public QObject{Q_OBJECTpublic:explicit ColorMaker(QObject *parent nullptr);~ColorMaker();private slots:QString testslot(int n);};#endif // COLORMAKER_H#include ColorMaker.hColorMaker::ColorMaker(QObject *parent){}ColorMaker::~ColorMaker(){}QString ColorMaker::testslot(int n){return q;}调用#include widget.h//#include qobjectdefs.h#include ui_widget.h#include QDebug#include QMetaProperty#include QMetaObjectWidget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget){ui-setupUi(this);ColorMaker *cm new ColorMaker();QString retVal;QMetaObject::invokeMethod(this,test, Qt::DirectConnection);QMetaObject::invokeMethod(cm,testslot, Qt::DirectConnection,Q_RETURN_ARG(QString, retVal),Q_ARG(int,1));}void Widget::test(){int a 1;} Q_INVOKABLE 作用定义一个类的成员函数时使用Q_INVOKABLE宏来修饰就可以让该方法被元对象系统调用即把该函数注册到元对象系统。 注意事项Q_INVOKABLE宏必须放在返回类型前面。 如 private : Q_INVOKABLE  QString testmd(int n); QString ColorMaker::testmd(int n) { return md; } 使用场景 c和qml混用. 普通类成员函数是不能直接在qml使用。除非是声明为槽函数或者用Q_INVOKABLE声明函数. 和QMetaObject::invokeMethod()结合使用invokeMethod函数的参数member方法如果是自定义的普通函数需使用Q_INVOKABLE宏注册到元对象系统。 例子 class ColorMaker : public QObject{Q_OBJECTpublic:explicit ColorMaker(QObject *parent nullptr);~ColorMaker();private :Q_INVOKABLE  QString testmd(int n);};ColorMaker *cm new ColorMaker();QMetaObject::invokeMethod(cm,testmd, Qt::DirectConnection,Q_RETURN_ARG(QString, retVal),Q_ARG(int,1)); 完整代码 #ifndef COLORMAKER_H#define COLORMAKER_H#include QObjectclass CTest{public:CTest(){}int nAge;QString strName;};Q_DECLARE_METATYPE(CTest)class ColorMaker : public QObject{Q_OBJECTpublic:explicit ColorMaker(QObject *parent nullptr);~ColorMaker();Q_PROPERTY(int value READ getvalue WRITE setvalue NOTIFY valueChanged);Q_PROPERTY(CTest test READ gettest WRITE settest NOTIFY testChanged);//使用自定义的类int getvalue() const;void setvalue(const int value);CTest gettest() const;void settest(const CTest test);signals:void valueChanged(int value);void testChanged(CTest test);private slots:QString testslot(int n);private :Q_INVOKABLE  QString testmd(int n);private:int m_value;CTest m_test;};#endif // COLORMAKER_H#include ColorMaker.hColorMaker::ColorMaker(QObject *parent){}ColorMaker::~ColorMaker(){}int ColorMaker::getvalue() const{return m_value;}void ColorMaker::setvalue(const int value){m_value value;emit valueChanged(m_value);}CTest ColorMaker::gettest() const{return m_test;}void ColorMaker::settest(const CTest test){m_test test;emit testChanged(m_test);}QString ColorMaker::testslot(int n){return q;}QString ColorMaker::testmd(int n){return md;}#ifndef WIDGET_H#define WIDGET_H#include QWidget#include ColorMaker.hQT_BEGIN_NAMESPACEnamespace Ui { class Widget; }QT_END_NAMESPACEclass Widget : public QWidget{Q_OBJECTpublic:Widget(QWidget *parent nullptr);~Widget();enum Orientation {Up 1,Down 2,Left 4,Right 8};Q_ENUM(Orientation)  //向元对象系统注册枚举类型Q_DECLARE_FLAGS(OrientationFlag,Orientation)Q_FLAG(OrientationFlag)public slots:void recv(int nval);void recvtest(CTest test);public slots:void test();private:Ui::Widget *ui;};Q_DECLARE_OPERATORS_FOR_FLAGS(Widget::OrientationFlag)#endif // WIDGET_H#include widget.h//#include qobjectdefs.h#include ui_widget.h#include QDebug#include QMetaProperty#include QMetaObjectWidget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget){ui-setupUi(this);QMetaEnum metaEnum QMetaEnum::fromTypeWidget::Orientation();  //通过静态函数fromType获取QMetaEnum对象QString name metaEnum.name();                   //枚举名称int count metaEnum.keyCount();                  //枚举数量QString keyIndex metaEnum.key(0);               //下标为0的keyint valueIndex metaEnum.value(0);               //下标为0的valueQString Key metaEnum.valueToKey(Widget::Left);  //通过value得到keyint value metaEnum.keyToValue(Left);          //通过key得到valueQString Key2 metaEnum.valueToKeys(Widget::Left | Widget::Right);  //通过value得到keyint value2 metaEnum.keysToValue(Up | Down);qDebug() 枚举的名称 name;qDebug() 枚举的数量 QString::number(count);qDebug() index下标的key值 keyIndex;  //UpqDebug() index下标的Value值 QString::number(valueIndex);  //1qDebug() value对应的key值 Key; //LeftqDebug() value对应的key值 Key2; //Left|RightqDebug() key值对应的Vaule: QString::number(value);//4qDebug() key值对应的Vaule: QString::number(value2);//3ColorMaker *cm new ColorMaker();QObject *object   cm;connect(cm,ColorMaker::valueChanged,this,Widget::recv);connect(cm,ColorMaker::testChanged,this,Widget::recvtest);QString retVal;QMetaObject::invokeMethod(this,test, Qt::DirectConnection);QMetaObject::invokeMethod(cm,testslot, Qt::DirectConnection,Q_RETURN_ARG(QString, retVal),Q_ARG(int,1));QMetaObject::invokeMethod(cm,testmd, Qt::DirectConnection,Q_RETURN_ARG(QString, retVal),Q_ARG(int,1));cm-setvalue(1);int value1 cm-getvalue();cm-setProperty(value, 2);value cm-property(value).toInt();CTest test;test.nAge 2;test.strName qq;cm-setProperty(test,QVariant::fromValue(test));CTest test1 qvariant_castCTest(cm-property(test));const QMetaObject *metaobject object-metaObject();int ncount metaobject-propertyCount();for (int i 0; i ncount; i){QMetaProperty metaproperty metaobject-property(i);const char *name metaproperty.name();qDebug() name;QVariant value object-property(name);qDebug() value;}CTest s;s.nAge 1;s.strName hello;QVariant varTest;varTest.setValue(s);QVariant var QVariant::fromValue(s);bool b var.canConvertCTest();if(b){CTest test var.valueCTest();CTest test1 qvariant_castCTest(var);qDebug() test.nAge;qDebug() test.strName;}}Widget::~Widget(){delete ui;}void Widget::recv(int nval){int a nval;qDebug() a;}void Widget::recvtest(CTest test){qDebug() test.nAge;qDebug() test.strName;}void Widget::test(){int a 1;}
http://www.w-s-a.com/news/634812/

相关文章:

  • 设计作品网站怎么开网站
  • 上海网站开发制作建设网站的建设费用包括
  • 上海网站建设网站开发亚洲杯篮球直播在什么网站
  • 网站做seo第一步h5制作公司
  • 软件外包产业网络优化工程师是干嘛的
  • 怎么用服务器做局域网网站河西网站建设
  • 工业企业网站建设企业门户网站解决方案
  • 网站运营与管理论文网上商城都有哪些
  • 常德网站制作建设毕设电商网站设计
  • 西安企业模板建站福州+网站建设+医疗
  • 邹城市住房和建设局网站仙居网站建设贴吧
  • 为什么要用CGI做网站网站手机优化显示
  • 做袜子娃娃的网站做网站要学的东西
  • 类qq留言网站建设企业做网站公司
  • 如何查到网站建设三足鼎立小程序开发公司
  • 交互网站怎么做的wordpress ssl 错位
  • 公司宣传 如何做公司网站郑州做网站那
  • 衡阳市城乡建设协会官方网站免费游戏网站模板
  • 小程序怎么做优惠券网站合肥建站网站平台
  • 民制作网站价格株洲企业seo优化
  • 网站建设 岗位职责网站建设百度索引
  • 网站建设的内容下拉网站导航用ps怎么做
  • 怎样做p2p网站海口免费自助建站模板
  • 给企业建设网站的流程图wordpress 添加子菜单
  • 企业网站带新闻发布功能的建站皋兰县建设局网站
  • 国内外做gif的网站wordpress数据库教程
  • 成都建站平台自己做一个网站需要多少钱
  • 景区旅游网站平台建设公司企业网站源码
  • 免费高清网站推荐喂来苏州网络科技有限公司
  • php做的大型网站有哪些备案博客域名做视频网站会怎么样