界面

元对象测试_#ifndef

代码

qperson.h

#ifndef QPERSON_H
#define QPERSON_H

#include <QObject>

class QPerson : public QObject
{
Q_OBJECT
Q_CLASSINFO("author", "Shao ZHeming")
Q_CLASSINFO("company", "nio")
Q_CLASSINFO("version", "1.0")
Q_PROPERTY(unsigned age READ getAge WRITE setAge NOTIFY ageChanged)
Q_PROPERTY(QString name MEMBER m_name) //和属性绑定
Q_PROPERTY(int score MEMBER m_score)

private:
unsigned m_age = 10;
QString m_name;
int m_score = 79;

public:
explicit QPerson(QString name, QObject *parent = nullptr);

unsigned getAge(void);
void setAge(unsigned value);
void incAge(void);

signals:
unsigned ageChanged(unsigned value);
};

#endif // QPERSON_H

qperson.cpp

#include "qperson.h"

QPerson::QPerson(QString name, QObject *parent) : QObject(parent)
{
m_name = name;
}

unsigned QPerson::getAge()
{
return m_age;
}

void QPerson::setAge(unsigned value)
{
m_age = value;
emit(ageChanged(m_age)); //向函数发射信号
}

void QPerson::incAge()
{
m_age++;
emit(ageChanged(m_age)); //向函数发射信号
}

widget.h

#ifndef WIDGET_H
#define WIDGET_H

#include <QWidget>
#include "qperson.h"

QT_BEGIN_NAMESPACE
namespace Ui { class Widget; }
QT_END_NAMESPACE

class Widget : public QWidget
{
Q_OBJECT
private:
QPerson *boy;
QPerson *girl;

public:
Widget(QWidget *parent = nullptr);
~Widget();

private:
Ui::Widget *ui;
void on_ageChanged(unsigned value);

private slots:
void on_spin_valueChanged(int arg1);
void on_btnBoyInc_clicked();
void on_btnGrilInc_clicked();
void on_btnClassInfo_clicked();
};
#endif // WIDGET_H

widget.cpp

#include "widget.h"
#include "ui_widget.h"
#include <QMetaProperty>

Widget::Widget(QWidget *parent)
: QWidget(parent)
, ui(new Ui::Widget)
{
ui->setupUi(this);
ui->spinBoxBoy->setProperty("isBoy", true);
ui->spinBoxGirl->setProperty("isBoy", false);

boy = new QPerson("王小明");
boy->setProperty("score", 95);
boy->setProperty("age", 10);
boy->setProperty("sex", "boy");
connect(boy, &QPerson::ageChanged, this, &Widget::on_ageChanged);

girl = new QPerson("小红");
girl->setProperty("score", 95);
girl->setProperty("age", 5);
girl->setProperty("sex", "girl");
connect(girl, &QPerson::ageChanged, this, &Widget::on_ageChanged);

connect(ui->spinBoxBoy, SIGNAL(valueChanged(int)),
this, SLOT(on_spin_valueChanged(int)));
connect(ui->spinBoxGirl, SIGNAL(valueChanged(int)),
this, SLOT(on_spin_valueChanged(int)));
}

Widget::~Widget()
{
delete ui;
}

void Widget::on_spin_valueChanged(int arg1)
{
Q_UNUSED(arg1);
QSpinBox *spinBox = qobject_cast<QSpinBox *>(sender());
if(spinBox->property("isBoy").toBool())
boy->setAge(spinBox->value());
else
girl->setAge(spinBox->value());
}

void Widget::on_ageChanged(unsigned value)
{
Q_UNUSED(value);
QPerson *aPerson = qobject_cast<QPerson *>(sender());
QString aName = aPerson->property("name").toString();
QString aSex = aPerson->property("sex").toString();

unsigned aAge = aPerson->getAge();
if(aSex == "boy"){
ui->spinBoxBoy->setValue(aAge);
}
else
ui->spinBoxGirl->setValue(aAge);

ui->textEdit->appendPlainText(aName + "," + aSex
+ QString::asprintf(",年龄=%d", aAge));
}

void Widget::on_btnBoyInc_clicked()
{
boy->incAge();
}

void Widget::on_btnGrilInc_clicked()
{
girl->incAge();
}

void Widget::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<meta->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<meta->classInfoCount();++i)
{
QMetaClassInfo classInfo=meta->classInfo(i);
ui->textEdit->appendPlainText(
QString("Name=%1; Value=%2").arg(classInfo.name()).arg(classInfo.value()));
}
}

主要是给自己看的,所以肯定会出现很多错误哈哈哈哈哈