QT乱翻书-元对象
码云
QT乱翻书-元对象
inherits("QTimer") 是否继承自 //类型转换 qobject_cast(obj); //属性系统 Q_PROPERTY //元对象 metaObject()->classInfo(0).name(); //获取信号发射者的指针 sender() //发送信号sign emit //数字+-数字调整框 QSpinBox //绑定 MEMBER
#ifndef QMYWIDGET_H #define QMYWIDGET_H #include#include "qperson.h" namespace Ui { class QmyWidget; } class QmyWidget : public QWidget { Q_OBJECT private: QPerson *boy; QPerson *girl; public: explicit QmyWidget(QWidget *parent = 0); ~QmyWidget(); private: Ui::QmyWidget *ui; signals: private slots: //自定义槽函数 void on_ageChanged(int value); void on_spin_valueChanged(int arg1); //界面按钮的槽函数 void on_btnClear_clicked(); void on_btnBoyInc_clicked(); void on_btnGirlInc_clicked(); void on_btnClassInfo_clicked(); }; #endif // QMYWIDGET_H
#ifndef QPERSON_H #define QPERSON_H #includeclass QPerson : public QObject { Q_OBJECT Q_CLASSINFO("author","Wang") Q_CLASSINFO("company","UPC") Q_CLASSINFO("version","1.0.0") Q_PROPERTY(int age READ age WRITE setAge NOTIFY ageChanged) Q_PROPERTY(QString name MEMBER m_name) Q_PROPERTY(int score MEMBER m_score) private: int m_age=10; QString m_name; int m_score=79; public: explicit QPerson(QString fName, QObject *parent = nullptr); int age(); void setAge(int value); void incAge(); signals: void ageChanged( int value); public slots: }; #endif // QPERSON_H
/******************************************************************************** ** Form generated from reading UI file 'qmywidget.ui' ** ** Created by: Qt User Interface Compiler version 5.9.1 ** ** WARNING! All changes made in this file will be lost when recompiling UI file! ********************************************************************************/ #ifndef UI_QMYWIDGET_H #define UI_QMYWIDGET_H #include#include #include #include #include #include #include #include #include #include #include #include QT_BEGIN_NAMESPACE class Ui_QmyWidget { public: QVBoxLayout *verticalLayout; QGridLayout *gridLayout; QLabel *label; QSpinBox *spinBoy; QPushButton *btnBoyInc; QPushButton *btnClassInfo; QLabel *label_2; QSpinBox *spinGirl; QPushButton *btnGirlInc; QPushButton *btnClear; QPlainTextEdit *textEdit; void setupUi(QWidget *QmyWidget) { if (QmyWidget->objectName().isEmpty()) QmyWidget->setObjectName(QStringLiteral("QmyWidget")); QmyWidget->resize(410, 320); verticalLayout = new QVBoxLayout(QmyWidget); verticalLayout->setSpacing(6); verticalLayout->setContentsMargins(11, 11, 11, 11); verticalLayout->setObjectName(QStringLiteral("verticalLayout")); gridLayout = new QGridLayout(); gridLayout->setSpacing(6); gridLayout->setObjectName(QStringLiteral("gridLayout")); label = new QLabel(QmyWidget); label->setObjectName(QStringLiteral("label")); gridLayout->addWidget(label, 0, 0, 1, 1); spinBoy = new QSpinBox(QmyWidget); spinBoy->setObjectName(QStringLiteral("spinBoy")); spinBoy->setMinimum(0); spinBoy->setMaximum(200); spinBoy->setValue(10); gridLayout->addWidget(spinBoy, 0, 1, 1, 1); btnBoyInc = new QPushButton(QmyWidget); btnBoyInc->setObjectName(QStringLiteral("btnBoyInc")); gridLayout->addWidget(btnBoyInc, 0, 2, 1, 1); btnClassInfo = new QPushButton(QmyWidget); btnClassInfo->setObjectName(QStringLiteral("btnClassInfo")); gridLayout->addWidget(btnClassInfo, 0, 3, 1, 1); label_2 = new QLabel(QmyWidget); label_2->setObjectName(QStringLiteral("label_2")); gridLayout->addWidget(label_2, 1, 0, 1, 1); spinGirl = new QSpinBox(QmyWidget); spinGirl->setObjectName(QStringLiteral("spinGirl")); spinGirl->setMaximum(200); spinGirl->setValue(20); gridLayout->addWidget(spinGirl, 1, 1, 1, 1); btnGirlInc = new QPushButton(QmyWidget); btnGirlInc->setObjectName(QStringLiteral("btnGirlInc")); gridLayout->addWidget(btnGirlInc, 1, 2, 1, 1); btnClear = new QPushButton(QmyWidget); btnClear->setObjectName(QStringLiteral("btnClear")); gridLayout->addWidget(btnClear, 1, 3, 1, 1); verticalLayout->addLayout(gridLayout); textEdit = new QPlainTextEdit(QmyWidget); textEdit->setObjectName(QStringLiteral("textEdit")); verticalLayout->addWidget(textEdit); retranslateUi(QmyWidget); QMetaObject::connectSlotsByName(QmyWidget); } // setupUi void retranslateUi(QWidget *QmyWidget) { QmyWidget->setWindowTitle(QApplication::translate("QmyWidget", "MetaObject\347\232\204\344\275\277\347\224\250", Q_NULLPTR)); label->setText(QApplication::translate("QmyWidget", "\350\256\276\347\275\256\347\224\267\347\224\237\345\271\264\351\276\204", Q_NULLPTR)); btnBoyInc->setText(QApplication::translate("QmyWidget", "boy\351\225\277\345\244\247\344\270\200\345\262\201", Q_NULLPTR)); btnClassInfo->setText(QApplication::translate("QmyWidget", "\347\261\273\347\232\204\345\205\203\345\257\271\350\261\241\344\277\241\346\201\257", Q_NULLPTR)); label_2->setText(QApplication::translate("QmyWidget", "\350\256\276\347\275\256\345\245\263\347\224\237\345\271\264\351\276\204", Q_NULLPTR)); btnGirlInc->setText(QApplication::translate("QmyWidget", "girl\351\225\277\345\244\247\344\270\200\345\262\201", Q_NULLPTR)); btnClear->setText(QApplication::translate("QmyWidget", "\346\270\205\347\251\272\346\226\207\346\234\254\346\241\206", Q_NULLPTR)); } // retranslateUi }; namespace Ui { class QmyWidget: public Ui_QmyWidget {}; } // namespace Ui QT_END_NAMESPACE #endif // UI_QMYWIDGET_H
#include "qmywidget.h" #includeint main(int argc, char *argv[]) { QApplication a(argc, argv); QmyWidget w; w.show(); return a.exec(); }
#include "qmywidget.h" #include "ui_qmywidget.h" #includeQmyWidget::QmyWidget(QWidget *parent) : QWidget(parent), ui(new Ui::QmyWidget) {//构造函数 ui->setupUi(this); boy=new QPerson("王小明"); boy->setProperty("score",95); boy->setProperty("age",10); boy->setProperty("sex","Boy");//动态属性 // connect(boy,SIGNAL(ageChanged(int)),this,SLOT(on_ageChanged(int))); connect(boy,&QPerson::ageChanged,this,&QmyWidget::on_ageChanged); girl=new QPerson("张小丽"); girl->setProperty("score",81); girl->setProperty("age",20); girl->setProperty("sex","Girl");//动态属性 connect(girl,&QPerson::ageChanged,this,&QmyWidget::on_ageChanged); ui->spinBoy->setProperty("isBoy",true); //动态属性 ui->spinGirl->setProperty("isBoy",false); // 不能使用此形式,因为QSpinBox有两种参数形式的valueChanged()信号 // connect(ui->spinGirl,&QSpinBox::valueChanged, // this,&QmyWidget::on_spinBoy_valueChanged); connect(ui->spinGirl,SIGNAL(valueChanged(int)), this,SLOT(on_spin_valueChanged(int))); connect(ui->spinBoy,SIGNAL(valueChanged(int)), this,SLOT(on_spin_valueChanged(int))); } QmyWidget::~QmyWidget() { delete ui; } void QmyWidget::on_ageChanged( int value) {//响应QPerson的ageChanged()信号 Q_UNUSED(value); QPerson *aPerson = qobject_cast (sender()); //类型投射 QString hisName=aPerson->property("name").toString(); //姓名 // QString hisName=aPerson->name(); //获取姓名,错误 QString hisSex=aPerson->property("sex").toString(); //动态属性 int hisAge=aPerson->age();//通过接口函数获取年龄 // int hisAge=aPerson->property("age").toInt();//通过属性获得年龄 ui->textEdit->appendPlainText(hisName+","+hisSex +QString::asprintf(",年龄=%d",hisAge)); } void QmyWidget::on_btnClear_clicked() {//"清空文本框"按钮 ui->textEdit->clear(); } void QmyWidget::on_btnBoyInc_clicked() {//"boy长大一岁"按钮 boy->incAge(); } void QmyWidget::on_btnGirlInc_clicked() {//"girl长大一岁"按钮 girl->incAge(); } void QmyWidget::on_spin_valueChanged(int arg1) {//响应界面上spinBox的valueChanged(int)信号 Q_UNUSED(arg1); QSpinBox *spinBox = qobject_cast (sender()); if (spinBox->property("isBoy").toBool()) boy->setAge(spinBox->value()); else girl->setAge(spinBox->value()); } void QmyWidget::on_btnClassInfo_clicked() {//"类的元对象信息"按钮 // const QMetaObject *meta=boy->metaObject(); const QMetaObject *meta=girl->metaObject(); // const QMetaObject *meta=ui->spinBoy->metaObject(); ui->textEdit->clear(); ui->textEdit->appendPlainText("==元对象信息==\n"); ui->textEdit->appendPlainText(QString("类名称:%1\n").arg(meta->className())); ui->textEdit->appendPlainText("property"); for (int i=meta->propertyOffset();i propertyCount();i++) { const char* propName=meta->property(i).name(); ui->textEdit->appendPlainText( QString("属性名称=%1,属性值=%2").arg(propName).arg(boy->property(propName).toString())); } ui->textEdit->appendPlainText(""); ui->textEdit->appendPlainText("classInfo"); for (int i=meta->classInfoOffset();i classInfoCount();++i) { QMetaClassInfo classInfo=meta->classInfo(i); ui->textEdit->appendPlainText( QString("Name=%1; Value=%2").arg(classInfo.name()).arg(classInfo.value())); } }
#include "qperson.h" QPerson::QPerson(QString fName,QObject *parent) : QObject(parent) { //构造函数 m_name=fName; } int QPerson::age() { //返回age return m_age; } void QPerson::setAge(int value) {//设置age m_age=value; emit ageChanged(m_age); //发射信号 } void QPerson::incAge() { m_age++; emit ageChanged(m_age);//发射信号 }
<?xml version="1.0" encoding="UTF-8"?> <ui version="4.0"> <class>QmyWidgetclass> <widget class="QWidget" name="QmyWidget"> <property name="geometry"> <rect> <x>0x> <y>0y> <width>481width> <height>320height> rect> property> <property name="windowTitle"> <string>MetaObject的使用string> property> <layout class="QVBoxLayout" name="verticalLayout"> <item> <layout class="QGridLayout" name="gridLayout"> <item row="0" column="0"> <widget class="QLabel" name="label"> <property name="text"> <string>设置男生年龄string> property> widget> item> <item row="0" column="1"> <widget class="QSpinBox" name="spinBoy"> <property name="minimum"> <number>0number> property> <property name="maximum"> <number>200number> property> <property name="value"> <number>10number> property> widget> item> <item row="0" column="2"> <widget class="QPushButton" name="btnBoyInc"> <property name="text"> <string>boy长大一岁string> property> widget> item> <item row="0" column="3"> <widget class="QPushButton" name="btnClassInfo"> <property name="text"> <string>类的元对象信息string> property> widget> item> <item row="1" column="0"> <widget class="QLabel" name="label_2"> <property name="text"> <string>设置女生年龄string> property> widget> item> <item row="1" column="1"> <widget class="QSpinBox" name="spinGirl"> <property name="maximum"> <number>200number> property> <property name="value"> <number>20number> property> widget> item> <item row="1" column="2"> <widget class="QPushButton" name="btnGirlInc"> <property name="text"> <string>girl长大一岁string> property> widget> item> <item row="1" column="3"> <widget class="QPushButton" name="btnClear"> <property name="text"> <string>清空文本框string> property> widget> item> layout> item> <item> <widget class="QPlainTextEdit" name="textEdit"/> item> layout> widget> <layoutdefault spacing="6" margin="11"/> <resources/> <connections/> ui>