空闲时间,参考课本demo,做一下练习。
字体的颜色主要用QPalette类,调色板的作用,控制着窗口部件的颜色和外观,包括背景色、前景色、文本颜色、边框颜色等。
字体的显示样式主要用Font类,用于管理字体。
元对象的使用(QObject派生类都具有与之相关联的元对象):
主要练习通过元对象系统,获取类名,属性等,这里可以设置一些类信息和属性信息,然后使用。
只贴出必要代码,其他的都是信号,槽,以及控件的基础使用。
1:主要是字体的处理。
这里测试时发现,TextEdit在设置字体斜体和粗体时,文本框中在ui上设置的文本无法生效,其他正常。
//字体颜色的控制
void Dialog::init()
{connect(ui->rb_red, SIGNAL(clicked()), this, SLOT(do_setFontColor()));connect(ui->rb_blue, SIGNAL(clicked()), this, SLOT(do_setFontColor()));connect(ui->rb_black, SIGNAL(clicked()), this, SLOT(do_setFontColor()));
}//Plain Text Edit 和TextEdit 一样
void Dialog::do_setFontColor()
{QPalette plet = ui->te_Display->palette();QPalette plet1 = ui->pte_Display->palette();if(ui->rb_red->isChecked()){plet.setColor(QPalette::Text, Qt::red);plet1.setColor(QPalette::Text, Qt::red);}else if(ui->rb_blue->isChecked()){plet.setColor(QPalette::Text, Qt::blue);plet1.setColor(QPalette::Text, Qt::blue);}else{plet.setColor(QPalette::Text, Qt::black);plet1.setColor(QPalette::Text, Qt::black);}ui->te_Display->setPalette(plet);ui->pte_Display->setPalette(plet1);
}//字体显示样式的控制 斜体和粗体类似 setItalic setBold
void Dialog::on_cb_underline_clicked(bool checked)
{QFont font = ui->te_Display->font();font.setUnderline(checked); //其他可以参考ui->te_Display->setFont(font);QFont font1 = ui->te_Display->font();font1.setUnderline(checked); //其他可以参考ui->pte_Display->setFont(font1);
}
2:元对象系统的练习
2.1 设置必要的类信息
Q_CLASSINFO("author","han")
Q_CLASSINFO("company","UPC")
Q_CLASSINFO("version","1.0.0")
2.2 通过元对象系统QMetaObject获取对应的类信息:
QObject *obj=m_boy;
const QMetaObject *meta = obj->metaObject();
for (int i=meta->classInfoOffset();i<meta->classInfoCount();++i)
{QMetaClassInfo classInfo=meta->classInfo(i);ui->pte_Display->appendPlainText(QString("Name=%1; Value=%2").arg(classInfo.name()).arg(classInfo.value()));
}
2.3 设置必要的属性信息:
//属性信息 类型 名称 READ/GET 方法和 WRITE/SET 方法:指定获取和设置属性值的方法。可以使用 MEMBER、READ、WRITE、RESET 或 NOTIFY 关键字来定义这些方法。
Q_PROPERTY(int age READ getAge WRITE setAge NOTIFY ageChanged)
Q_PROPERTY(QString name MEMBER m_name); //属性对应成员
Q_PROPERTY(int score MEMBER m_score);
//需要有上面对应的成员变量m_name 和m_score
// 以及上面提到的函数getAge setAge(int value); 和信号函数: ageChanged(int value);
2.4:对应的属性信息赋值方法
//专门设计一个基于object的类TPerson m_boy是对应的一个类对象
m_boy = new TPerson("小明", this); //这种设置父对象会由父对象释放?
m_boy->setAge(12);
//初始化 内部变量和界面要一致
ui->sb_boy_dis->setValue(22);//需要绑定槽函数 触发日志的打印
m_boy->setProperty("age", 22);
m_boy->setProperty("score", 22);
m_boy->setProperty("sex", "boy"); //动态的 connect(m_boy, SIGNAL(ageChanged(int)), this, SLOT(do_ageChanged(int)));
connect(m_gril, &TPerson::ageChanged, this, &Dialog::do_ageChanged);
2.5:通过property获取设置的对应属性
//即对应槽函数内部逻辑do_ageChanged(int value)
TPerson* person = qobject_cast<TPerson*>(sender());
QString his_name = person->property("name").toString();
QString his_sex = person->property("sex").toString();
int his_age = person->property("age").toInt();
int his_age1 = person->getAge();QString display = QString("%1,%2,年龄= %3,%4").arg(his_name).arg(his_sex).arg(his_age).arg(his_age1);
ui->te_Display->append(display);
2.6:通过元对象系统QMetaObject获取相关的属性
#include <QMetaProperty>
void Dialog::on_pbn_info_clicked()
{if(m_boy ==nullptr ||m_gril == nullptr){ui->pte_Display->setPlainText("成员对象为空,请先构造。");return;}QObject *obj=m_boy;const QMetaObject *meta = obj->metaObject();ui->pte_Display->setPlainText("类名称:"+QString(meta->className()));
//对应的属性信息ui->pte_Display->appendPlainText("property");
// for (int i=0;i<meta->propertyCount();i++)for (int i=meta->propertyOffset();i<meta->propertyCount();i++){QMetaProperty property = meta->property(i);const char* propName = property.name();QString propValue=obj->property(propName).toString();QString str=QString("属性名称=%1,属性值=%2").arg(propName).arg(propValue);ui->pte_Display->appendPlainText(str);}
//对应的类信息ui->pte_Display->appendPlainText("");ui->pte_Display->appendPlainText("classInfo");for (int i=meta->classInfoOffset();i<meta->classInfoCount();++i){QMetaClassInfo classInfo=meta->classInfo(i);ui->pte_Display->appendPlainText(QString("Name=%1; Value=%2").arg(classInfo.name()).arg(classInfo.value()));}
}