QT第三天 小咪咪 2022-04-13 07:43 320阅读 0赞 ## 1.QPerson类的定义 ## #ifndef QPERSON_H #define QPERSON_H #include<QObject>//加入<QObject> class QPerson:public QObject { Q_OBJECT //为类的元对象定义"名称-值"信息 Q_CLASSINFO("auther","Wang") Q_CLASSINFO("company","UPC") Q_CLASSINFO("version","1.0.0") //定义属性 Q_PROPERTY(int age READ age WRITE setAge NOTIFY ageChanged)//没有MEMBER关键字,必须设置READ Q_PROPERTY(QString name MEMBER m_name)//设置了MEMBER,无需设置READ和WRITE属性 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();//发送ageChanged信号的函数 //定义了一个信号 //信号函数必须是无返回值的函数 //只需在某些条件下发送信号 signals: ageChanged(int value); public slots: public: QPerson(); }; #endif // QPERSON_H ## 2.元对象特性的使用 ## (1)QmyWidget类定义 #ifndef QMYWIDGET_H #define QMYWIDGET_H #include <QWidget> #include<qperson.h>//加入qperson.h文件 #include<QTextEdit> namespace Ui { class QmyWidget; } class QmyWidget : public QWidget { Q_OBJECT private://定义两个QPerson类型的指针变量 QPerson *boy; QPerson *girl; public: explicit QmyWidget(QWidget *parent = 0); ~QmyWidget(); private: Ui::QmyWidget *ui; private slots: //界面按钮槽函数 void on_btnClear_clicked(); void on_btnBoyInc_clicked(); void on_btnGirlInc_clicked(); void on_btnClassInfo_clicked(); //自定义槽函数 void on_ageChanged(int value); void on_spin_valueChanged(int arg1); }; #endif // QMYWIDGET_H (2)QmyWidget构造函数 QmyWidget::QmyWidget(QWidget *parent) : QWidget(parent), ui(new Ui::QmyWidget)//构造函数 { ui->setupUi(this); //Boy属性 boy=new QPerson("王小明"); boy->setProperty("score",95);//使用setProperty设置score属性 boy->setProperty("age",10);//使用setProperty设置age属性 boy->setProperty("sex","Boy");//使用setProperty设置动态属性sex connect(boy,&QPerson::ageChanged,this,&QmyWidget::on_ageChanged);//当信号只有一个,具有没有函数参数不同而同名时可以这样关联 //这里QPerson只有一个agechanged()信号 //例子: //connect(lineEdit,&QLineRdit::textChanged,this,&widget::on_textChanged); //QLineEdit只有一个信号textChanged(QString), //在自定义窗体类widget里定义一个槽函数on_textChanged(QString) //可以使用这样的方式将信号与槽函数关联, //具有不同参数的同名信号就不能采用函数指针的方式进行信号与槽的关联 //如QSpinBox有两个valueChanged()信号, //分别是void QSpinBox::valueChanged(int i); //void QSpinBox::valueChanged(const QString &text) ui->spinBoy->setProperty("isBoy",true);//动态属性 //Girl属性 girl=new QPerson("张小丽"); girl->setProperty("score",81); girl->setProperty("age",20); girl->setProperty("sex","Girl"); connect(girl,&QPerson::ageChanged,this,&QmyWidget::on_ageChanged); ui->spinGirl->setProperty("isBoy",false); //spinBox的valueChanged()信号与槽函数on_spin_valueChanged()关联 //此处只能使用SIGNAL和SLOT宏的形式 //因为valueChanged()有两种 connect(ui->spinBoy,SIGNAL(valueChanged(int)),this,SLOT(on_spin_valueChanged(int))); connect(ui->spinGirl,SIGNAL(valueChanged(int)),this,SLOT(on_spin_valueChanged(int))); //初始化spinBoy,spinGirl的值 ui->spinBoy->setValue(10); ui->spinGirl->setValue(20); } (3)槽函数 //自定义响应QPerson的ageChanged()信号的槽函数on_agechanged() void QmyWidget::on_ageChanged(int value) { Q_UNUSED(value);//Q_UNUSED() 没有实质性的作用,用来避免编译器警告 QPerson *aPerson=qobject_cast<QPerson *>(sender());//当某一个Object emit一个signal的时候,它就是一个sender, //系统会记录下当前是谁emit出这个signal的, //所以你在对应的slot里就可以通过 sender()得到当前是谁invoke了你的slot。 //类型投射 QString hisName=aPerson->property("name").toString();//输出姓名 QString hisSex=aPerson->property("sex").toString();//输出性别 int hisAge=aPerson->age();//通过接口函数获取年龄 //int hisAge=aPerson->property("age").toInt();通过属性获得年龄 ui->textEdit->append(hisName+","+hisSex+QString::asprintf(",年龄=%d",hisAge)); } //spinBox的valueChanged(int)信号与槽函数on_spin_valueChanged(int)关联 void QmyWidget::on_spin_valueChanged(int arg1) { Q_UNUSED(arg1); QSpinBox *spinBox=qobject_cast<QSpinBox *>(sender()); if(spinBox->property("isBoy").toBool())//通过isBoy值来确定调用Boy,Girl的setAge()函数 { boy->setAge(spinBox->value()); //ui->spinBoy->setValue(arg1); } else girl->setAge(spinBox->value()); } //类的元对象信息按钮槽函数 void QmyWidget::on_btnClassInfo_clicked() { const QMetaObject *meta=boy->metaObject(); ui->textEdit->clear(); ui->textEdit->append("==元对象信息==\n"); ui->textEdit->append(QString("类名称:%1\n").arg(meta->className())); ui->textEdit->append("property"); for(int i=meta->propertyOffset();i<meta->propertyCount();i++) { QMetaProperty prop=meta->property(i); const char* propName=prop.name(); QString propValue=boy->property(propName).toString(); ui->textEdit->append(QString("属性名称=%1\n,属性值=%2").arg(propName).arg(propValue)); } ui->textEdit->append(""); ui->textEdit->append("classInfo"); for(int i=meta->classInfoOffset();i<meta->classInfoCount();i++) { QMetaClassInfo classInfo=meta->classInfo(i); ui->textEdit->append(QString("Name=%1;Value=%2").arg(classInfo.name()).arg(classInfo.value())); } } void QmyWidget::on_btnClear_clicked() {//"清空文本框"按钮 ui->textEdit->clear(); } void QmyWidget::on_btnBoyInc_clicked() {//"boy长大一岁"按钮 boy->incAge(); } void QmyWidget::on_btnGirlInc_clicked() {//"girl长大一岁"按钮 girl->incAge(); } ## 3.运行结果 ## ![在这里插入图片描述][watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3RoZVJvb2tpZTE_size_16_color_FFFFFF_t_70] ![在这里插入图片描述][watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3RoZVJvb2tpZTE_size_16_color_FFFFFF_t_70 1] [watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3RoZVJvb2tpZTE_size_16_color_FFFFFF_t_70]: /images/20220413/e8c3c808ff5d4682aeb3fc2d9fbb624f.png [watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3RoZVJvb2tpZTE_size_16_color_FFFFFF_t_70 1]: /images/20220413/4b804a1e01614ecbac228381e0390c54.png
相关 QT第四天(上) SpinBox的使用 include "widget.h" include "ui_widget.h" Widget::Wid 待我称王封你为后i/ 2022年04月13日 14:59/ 0 赞/ 284 阅读
相关 QT第三天 字符串与输入输出 字符串与数值之间的转换 void Widget::on_btnCal_clicked() { QString st 谁践踏了优雅/ 2022年04月13日 13:23/ 0 赞/ 348 阅读
相关 QT第三天 1.QPerson类的定义 ifndef QPERSON_H define QPERSON_H include<QObject>//加入<QObj 小咪咪/ 2022年04月13日 07:43/ 0 赞/ 321 阅读
相关 Qt第七天 QListWidget和QToolButton的用法 界面设计 1.混合式界面设计 ![在这里插入图片描述][watermark_type_ZmFuZ3poZW5 ╰+攻爆jí腚メ/ 2022年04月12日 10:50/ 0 赞/ 319 阅读
相关 QT第六天 QComboBox和QPlainTextEdit的用法 QComboBox的使用 设计时属性设置 在界面上放置QComboBox组件后,双击组件,弹出列表项编 布满荆棘的人生/ 2022年04月12日 07:21/ 0 赞/ 346 阅读
相关 QT第五天 时间日期与定时器 时间日期相关的类 ([https://blog.csdn.net/theRookie1/article/details/84672489][htt 缺乏、安全感/ 2022年04月12日 04:50/ 0 赞/ 377 阅读
相关 QT第十天 QFileSystemModel 使用QFileSystemModel作为数据模型,QTreeView,QListView和QTableView为主要组件 在Tree Bertha 。/ 2022年04月11日 11:42/ 0 赞/ 329 阅读
相关 Qt第八天 QTreeWidget和QDockWidget用法 本例子以QTreeWidget为主要组件,创建一个照片管理器 头文件 ifndef MAINWINDO 旧城等待,/ 2022年04月11日 02:15/ 0 赞/ 342 阅读
相关 Qt第十三天 自定义代理 \\基类为QItemDelegate, 必须实现4个函数 //自定义代理组件必须继承一下四个函数,函数的原型都是固定的 //创建编辑组件 QW た 入场券/ 2022年04月05日 07:09/ 0 赞/ 428 阅读
相关 Qt第十八天 Graphics View绘图程序实例 \\可以创建矩形,椭圆,圆,三角形,梯形,直线,文字等基本图形项 每个图形项可以被选择,拖动,放缩,旋转 图形项的前置和后 逃离我推掉我的手/ 2022年04月04日 11:47/ 0 赞/ 380 阅读
还没有评论,来说两句吧...