动图:
setProperty对控件设置属性,用于判断是哪一个控件,很巧妙
使用qobject_cast,对类指针进行下行转换,也很不错
qperson.h–年龄增加功能实现
#ifndef QPERSON_H
#define QPERSON_H
#include <QObject>
#include <QString>
class QPerson : public QObject
{
Q_OBJECT
Q_CLASSINFO("auther", "Li Guoqiang")
Q_CLASSINFO("company", "Rssharp")
Q_CLASSINFO("Version", "1.0")
/* Q_PROPERTY()是一个宏,用来在一个类中声明一个属性property*/
Q_PROPERTY(unsigned age READ age WRITE setAge NOTIFY ageChanged)
Q_PROPERTY(QString name MEMBER m_name)
Q_PROPERTY(int sorce MEMBER m_sorce)
private:
unsigned int m_age;
QString m_name;
int m_sorce;
QPerson(unsigned int m_age, QString m_name,int m_sorce)
{
this->m_age = m_age;
this->m_name = m_name;
this->m_sorce = m_sorce;
}
public:
explicit QPerson(QString name, QObject *parent = nullptr);//构造函数
unsigned age();
void setAge(unsigned value);
void incAge();
signals:
void ageChanged(unsigned value);
};
#endif // QPERSON_H
qperson.cpp
#include "qperson.h"
/*
* 12.26
* 男生、女生年龄的增加功能页面
*/
QPerson::QPerson(QString name, QObject *parent) : QObject(parent)
{
m_name = name;//构造函数
}
unsigned QPerson::age()
{
return m_age;
}
void QPerson::setAge(unsigned value)
{
m_age = value;
emit this->ageChanged(m_age);
}
void QPerson::incAge()
{
m_age++;
emit this->ageChanged(m_age);
}
buttery_hatch.h–控件操作
#ifndef BUTTERY_HATCH_H
#define BUTTERY_HATCH_H
#include <QWidget>
#include "qperson.h"//专门设定年龄姓名的文件
#include <QSpinBox>//上下切换数值
#include <QMetaObject>
#include <QMetaProperty>//可以用来获取我们设定的成员属性
#include <QMetaClassInfo>//可以用来获取我们设定的类属性
#include <QDebug>
namespace Ui {
class Buttery_Hatch;
}
class Buttery_Hatch : public QWidget
{
Q_OBJECT
public:
explicit Buttery_Hatch(QWidget *parent = nullptr);
~Buttery_Hatch();
QPerson * boy;
QPerson * girl;
private slots:
void on_pushButton_4_clear_text_clicked();
void on_pushButton_on_boy_age_clicked();
void on_pushButton_2_on_girl_age_clicked();
void on_ageChanged(unsigned value);/*年龄改变*/
void on_spinBox_boy_valueChanged(int arg1);/*spinBox中男孩的数值改变*/
void on_girl_valueChanged(int arg2);/*spinBox中女孩的数值改变*/
void on_pushButton_3_object_clicked();
private:
Ui::Buttery_Hatch *ui;
};
#endif // BUTTERY_HATCH_H
Buttery_Hatch.cpp
#include "buttery_hatch.h"
#include "ui_buttery_hatch.h"
/*
* 12.21
* 登陆界面右上角按键可以操控该界面的显示、隐藏
* 男生、女生年龄的增加页面QPerson类中实现
* 具体的年龄增加功能是在
* 12.26
*
*
* 构造函数中给成员属性赋初值
*/
Buttery_Hatch::Buttery_Hatch(QWidget *parent) :
QWidget(parent),boy(NULL),girl(NULL),
ui(new Ui::Buttery_Hatch)
{
ui->setupUi(this);
ui->spinBox_boy->setProperty("isBoy", true);/*设置属性,方便对spinBox控件做出男生、女生的判断*/
ui->spinBox_2_girl->setProperty("isBoy",false);
ui->pushButton_on_boy_age->setProperty("isBoy", true);/*设置属性,方便对pushButton控件做出男生、女生的判断*/
ui->pushButton_2_on_girl_age->setProperty("isBoy", false);
/*
* 12.26
* 构建Buttery_Hatch对象的之后,构建QPerson类
* 为其中的类成员设定初始值,有点类似于key、value
*/
boy = new QPerson("HanLongXia");
boy->setProperty("score",95);
boy->setProperty("age", 16);
boy->setProperty("sex", "Boy");
connect(boy, &QPerson::ageChanged, this, &Buttery_Hatch::on_ageChanged);
girl = new QPerson("LuoQianWen");
girl->setProperty("score",92);
girl->setProperty("age", 15);
girl->setProperty("sex", "Girl");
connect(girl, &QPerson::ageChanged, this, &Buttery_Hatch::on_ageChanged);
/*static_cast是指显性类型强制转换,由于valueChanged信号发生了重载,因此指明当前信号类型是 int类型*/
connect(ui->spinBox_2_girl, static_cast<void(QSpinBox::*)(int)>(&QSpinBox::valueChanged), this, &Buttery_Hatch::on_girl_valueChanged);
}
Buttery_Hatch::~Buttery_Hatch()
{
delete ui;
}
/*
* 清空文本框数据,该处直接跳转到槽
*/
void Buttery_Hatch::on_pushButton_4_clear_text_clicked()
{
ui->plainTextEdit->clear();
}
void Buttery_Hatch::on_pushButton_on_boy_age_clicked()
{
/*
* 12.26
* 点击男孩年龄增加按键,qperson.cpp中的m_age就会++,然后通过信号(ageChanged)把增加的数值发送过来
* 然后通过建立的连接connect,本地文件的槽函数(on_ageChanged)响应信号
* 点击男孩、女孩年龄增加按键,通过对按键设置属性,判断点击的是男孩增加按键还是女孩增加按键
* 然后把qperson.cpp中的m_age一同反应到spinBox中
*/
boy->incAge();
QPushButton *pushbutton_boy = qobject_cast<QPushButton *>(sender());
if(pushbutton_boy->property("isBoy").toBool())
{
qDebug()<<"spinBox_boy"<<endl;
ui->spinBox_boy->setValue(boy->age());
}
else
{
qDebug()<<"spinBox_2_girl"<<endl;
ui->spinBox_2_girl->setValue(girl->age());
}
}
void Buttery_Hatch::on_pushButton_2_on_girl_age_clicked()
{
girl->incAge();
QPushButton *pushbutton_boy = qobject_cast<QPushButton *>(sender());
if(pushbutton_boy->property("isBoy").toBool())
{
qDebug()<<"spinBox_boy"<<endl;
ui->spinBox_boy->setValue(boy->age());
}
else
{
qDebug()<<"spinBox_2_girl"<<endl;
ui->spinBox_2_girl->setValue(girl->age());
}
}
void Buttery_Hatch::on_ageChanged(unsigned value)
{
/*消除这个警告的宏 Q_UNUSED,消除“未引用的局部变量”警告*/
Q_UNUSED(value)
QPerson *qperson = qobject_cast<QPerson *>(sender());/*sender返回发出信号的对象,用QObject类型接收,向下转型为QPerson类型*/
QString aName = qperson->property("name").toString().toUtf8();
QString aSex = qperson->property("sex").toString().toUtf8();
unsigned aAge = qperson->age();
/*显示数据的集合到文本框中*/
ui->plainTextEdit->appendPlainText(aName + "," +aSex + \
QString::asprintf(",age=%d",aAge).toUtf8() );
}
void Buttery_Hatch::on_spinBox_boy_valueChanged(int arg1)
{
Q_UNUSED(arg1)
QSpinBox *spinBox = qobject_cast<QSpinBox*>(sender());
if(spinBox->property("isBoy").toBool())
{
/*只要年龄改变,就会触发槽函数on_ageChanged()*/
boy->setAge(spinBox->value());
}
else
{
girl->setAge(spinBox->value());
}
}
void Buttery_Hatch::on_girl_valueChanged(int arg2)
{
Q_UNUSED(arg2)
QSpinBox *spinBox = qobject_cast<QSpinBox*>(sender());
if(spinBox->property("isBoy").toBool())/*获取isBoy属性*/
{
/*只要年龄改变,就会触发槽函数on_ageChanged()*/
boy->setAge(spinBox->value());
}
else
{
girl->setAge(spinBox->value());
}
}
void Buttery_Hatch::on_pushButton_3_object_clicked()
{
const QMetaObject *meta = girl->metaObject();
ui->plainTextEdit->clear();
ui->plainTextEdit->appendPlainText("==Meta object information==\n");
ui->plainTextEdit->appendPlainText(QString("The class name:%1\n").arg(meta->className()));
ui->plainTextEdit->appendPlainText("property");
for(int i = meta->propertyOffset(); i < meta->propertyCount(); i++)
{
/*读取我们在qperson.h中设置的Q_PROPERTY属性*/
QMetaProperty prop = meta->property(i);
const char * propname = prop.name();
QString propValue = boy->property(propname).toString();
/*将拿到的key、value显示到文本框内*/
ui->plainTextEdit->appendPlainText(QString("The attribute name : %1, The attribute value : %2").arg(propname).arg(propValue));
}
ui->plainTextEdit->appendPlainText(" ");
ui->plainTextEdit->appendPlainText("QMetaClassInfo");
for(int i = meta->classInfoOffset(); i < meta->classInfoCount(); i++)
{
/*读取我们在qperson.h中设置的Q_CLASSINFO属性*/
QMetaClassInfo classinfo = meta->classInfo(i);
/*将拿到的key、value显示到文本框内*/
ui->plainTextEdit->appendPlainText(QString("ClassInfo name : %1, ClassInfo value : %2").arg(classinfo.name()).arg(classinfo.value()));
}
}