206_QT_功能实现代码、界面控件操作代码分开实现,很不错【采用了Q_CLASSINFO、Q_PROPERTY、setProperty对控件设置属性、qobject_cast】

93 篇文章 3 订阅
65 篇文章 6 订阅

动图:

在这里插入图片描述
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()));
    }


}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

扳手的海角

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值