信号和槽机制解析
https://blog.51cto.com/9291927/2070398
#ifndef MYOBJECT_H #define MYOBJECT_H #include <QObject> #include <QString> #include <QDebug> class MyObject: public QObject { Q_OBJECT Q_PROPERTY(int age READ age WRITE setAge NOTIFY ageChanged) Q_PROPERTY(int score READ score WRITE setScore NOTIFY scoreChanged) Q_PROPERTY(Level level READ level WRITE setLevel) Q_CLASSINFO("Version","1.0") public: enum Level { Basic = 1, Middle, Advanced, Master }; Q_ENUM(Level) protected: QString m_name; Level m_level; int m_age; int m_score; void setLevel(const int& score) { if(score <= 60) { m_level = Basic; } else if(score < 100) { m_level = Middle; } else if(score < 150) { m_level = Advanced; } else { m_level = Master; } } public: explicit MyObject(QString name, QObject *parent = 0):QObject(parent) { m_name = name; setObjectName(m_name); connect(this, SIGNAL(ageChanged(int)), this, SLOT(onAgeChanged(int))); connect(this, SIGNAL(scoreChanged(int)), this, SLOT(onScoreChanged(int))); } int age()const { return m_age; } void setAge(const int& age) { m_age = age; emit ageChanged(m_age); } int score()const { return m_score; } void setScore(const int& score) { m_score = score; setLevel(m_score); emit scoreChanged(m_score); } Level level()const { return m_level; } void setLevel(const Level& level) { m_level = level; } signals: void ageChanged(int age); void scoreChanged(int score); public slots: void onAgeChanged(int age) { qDebug() << "age changed:" << age; } void onScoreChanged(int score) { qDebug() << "score changed:" << score; } }; #endif // MYOBJECT_H
main.cpp
#include <QCoreApplication> #include "myobject.h" int main(int argc, char *argv[]) { QCoreApplication a(argc, argv); MyObject ob("myobject"); //设置属性age ob.setProperty("age", QVariant(30)); qDebug() << "age: " << ob.age(); qDebug() << "property age: " << ob.property("age").toInt(); //设置属性score ob.setProperty("score", QVariant(90)); qDebug() << "score: " << ob.score(); qDebug() << "property score: " << ob.property("score").toInt(); qDebug() << "Level: " << ob.level(); ob.setProperty("level", 4); qDebug() << "level: " << ob.level(); qDebug() << "Property level: " << ob.property("level").toInt(); //内省intropection,运行时查询对象信息 qDebug() << "object name: " << ob.objectName(); qDebug() << "class name: " << ob.metaObject()->className(); qDebug() << "isWidgetType: " << ob.isWidgetType(); qDebug() << "inherit: " << ob.inherits("QObject"); return a.exec(); }
结果:


浙公网安备 33010602011771号