Qt——《开发指南》3.1源码分析

 界面:

 

ButterflyGraph:

可以看出,本工程在主程序main里调用窗口界面qmywidget,窗口界面继承了QWidget,并调用自定义类qperson,推测是qmywidget类中的一个属性

 

qmywidget的实现,调用了显示界面ui_qmywidget,包含了元对象QMetaProperty

 UML图:

QmyWidget中,on开头的都是槽函数,QmyWidget是主窗口,所以不发射信号,只接收信号

main.cpp

 1 #include "qmywidget.h"
 2 #include <QApplication>
 3 
 4 int main(int argc, char *argv[])
 5 {
 6     QApplication a(argc, argv);
 7     QmyWidget w;
 8     w.show();
 9 
10     return a.exec();
11 }

qperson.h

 1 #ifndef QPERSON_H
 2 #define QPERSON_H
 3 
 4 #include <QObject>
 5 
 6 class QPerson : public QObject
 7 {
 8     Q_OBJECT
 9 
10     Q_CLASSINFO("author","Wang")
11     Q_CLASSINFO("company","UPC")
12     Q_CLASSINFO("version","1.0.0")
13 
14     Q_PROPERTY(int age READ age WRITE setAge NOTIFY ageChanged)
15     Q_PROPERTY(QString name MEMBER m_name)
16     Q_PROPERTY(int score MEMBER m_score)
17 private:
18     int  m_age=10;
19     QString m_name;
20     int     m_score=79;
21 public:
22     explicit QPerson(QString fName, QObject *parent = nullptr);
23 
24     int     age();
25     void    setAge(int value);
26 
27     void    incAge();
28 signals:
29     void    ageChanged( int  value);
30 
31 public slots:
32 };
33 
34 #endif // QPERSON_H

qmywidget.cpp

  1 #include "qmywidget.h"
  2 #include "ui_qmywidget.h"
  3 #include    <QMetaProperty>
  4 
  5 QmyWidget::QmyWidget(QWidget *parent) :
  6     QWidget(parent),
  7     ui(new Ui::QmyWidget)
  8 {//构造函数
  9     ui->setupUi(this);
 10 
 11     boy=new QPerson("王小明");
 12     boy->setProperty("score",95);
 13     boy->setProperty("age",10);
 14     boy->setProperty("sex","Boy");//动态属性
 15 //    connect(boy,SIGNAL(ageChanged(int)),this,SLOT(on_ageChanged(int)));
 16     connect(boy,&QPerson::ageChanged,this,&QmyWidget::on_ageChanged);
 17 
 18     girl=new QPerson("张小丽");
 19     girl->setProperty("score",81);
 20     girl->setProperty("age",20);
 21     girl->setProperty("sex","Girl");//动态属性
 22     connect(girl,&QPerson::ageChanged,this,&QmyWidget::on_ageChanged);
 23 
 24     ui->spinBoy->setProperty("isBoy",true); //动态属性
 25     ui->spinGirl->setProperty("isBoy",false);
 26 
 27 //  不能使用此形式,因为QSpinBox有两种参数形式的valueChanged()信号
 28 //    connect(ui->spinGirl,&QSpinBox::valueChanged,
 29 //            this,&QmyWidget::on_spinBoy_valueChanged);
 30     connect(ui->spinGirl,SIGNAL(valueChanged(int)),
 31             this,SLOT(on_spin_valueChanged(int)));
 32     connect(ui->spinBoy,SIGNAL(valueChanged(int)),
 33             this,SLOT(on_spin_valueChanged(int)));
 34 }
 35 
 36 QmyWidget::~QmyWidget()
 37 {
 38     delete ui;
 39 }
 40 
 41 void QmyWidget::on_ageChanged( int value)
 42 {//响应QPerson的ageChanged()信号
 43     Q_UNUSED(value);
 44     QPerson *aPerson = qobject_cast<QPerson *>(sender()); //类型投射
 45     QString hisName=aPerson->property("name").toString(); //姓名
 46 //    QString hisName=aPerson->name(); //获取姓名,错误
 47     QString hisSex=aPerson->property("sex").toString(); //动态属性
 48     int hisAge=aPerson->age();//通过接口函数获取年龄
 49 //    int hisAge=aPerson->property("age").toInt();//通过属性获得年龄
 50 
 51     ui->textEdit->appendPlainText(hisName+","+hisSex
 52                                +QString::asprintf(",年龄=%d",hisAge));
 53 }
 54 
 55 void QmyWidget::on_btnClear_clicked()
 56 {//"清空文本框"按钮
 57     ui->textEdit->clear();
 58 }
 59 
 60 void QmyWidget::on_btnBoyInc_clicked()
 61 {//"boy长大一岁"按钮
 62     boy->incAge();
 63 }
 64 
 65 void QmyWidget::on_btnGirlInc_clicked()
 66 {//"girl长大一岁"按钮
 67     girl->incAge();
 68 }
 69 
 70 void QmyWidget::on_spin_valueChanged(int arg1)
 71 {//响应界面上spinBox的valueChanged(int)信号
 72     Q_UNUSED(arg1);
 73     QSpinBox *spinBox = qobject_cast<QSpinBox *>(sender());
 74     if (spinBox->property("isBoy").toBool())
 75         boy->setAge(spinBox->value());
 76     else
 77         girl->setAge(spinBox->value());
 78 }
 79 
 80 void QmyWidget::on_btnClassInfo_clicked()
 81 {//"类的元对象信息"按钮
 82     const QMetaObject *meta=boy->metaObject();
 83 //    const QMetaObject *meta=girl->metaObject();
 84 //    const QMetaObject *meta=ui->spinBoy->metaObject();
 85     ui->textEdit->clear();
 86 
 87     ui->textEdit->appendPlainText("==元对象信息==\n");
 88     ui->textEdit->appendPlainText(QString("类名称:%1\n").arg(meta->className()));
 89 
 90     ui->textEdit->appendPlainText("property");
 91     for (int i=meta->propertyOffset();i<meta->propertyCount();i++)
 92     {
 93         const char* propName=meta->property(i).name();
 94         ui->textEdit->appendPlainText(
 95            QString("属性名称=%1,属性值=%2").arg(propName).arg(boy->property(propName).toString()));
 96     }
 97 
 98     ui->textEdit->appendPlainText("");
 99     ui->textEdit->appendPlainText("classInfo");
100     for (int i=meta->classInfoOffset();i<meta->classInfoCount();++i)
101     {
102        QMetaClassInfo classInfo=meta->classInfo(i);
103         ui->textEdit->appendPlainText(
104            QString("Name=%1; Value=%2").arg(classInfo.name()).arg(classInfo.value()));
105     }
106 
107 }

qperson.cpp

 1 #include "qperson.h"
 2 
 3 QPerson::QPerson(QString fName,QObject *parent) : QObject(parent)
 4 { //构造函数
 5     m_name=fName;
 6 }
 7 
 8 int QPerson::age()
 9 { //返回age
10     return  m_age;
11 }
12 
13 void QPerson::setAge(int value)
14 {//设置age
15     m_age=value;
16     emit ageChanged(m_age); //发射信号
17 }
18 
19 void QPerson::incAge()
20 {
21     m_age++;
22     emit ageChanged(m_age);//发射信号
23 }

猜你喜欢

转载自www.cnblogs.com/cxc1357/p/11809584.html