qt初入门5:字体设置和元对象系统的练习

空闲时间,参考课本demo,做一下练习。

字体的颜色主要用QPalette类,调色板的作用,控制着窗口部件的颜色和外观,包括背景色、前景色、文本颜色、边框颜色等。

字体的显示样式主要用Font类,用于管理字体。

元对象的使用(QObject派生类都具有与之相关联的元对象):

主要练习通过元对象系统,获取类名,属性等,这里可以设置一些类信息和属性信息,然后使用。

只贴出必要代码,其他的都是信号,槽,以及控件的基础使用。

1:主要是字体的处理。

这里测试时发现,TextEdit在设置字体斜体和粗体时,文本框中在ui上设置的文本无法生效,其他正常。

C++ 复制代码
//字体颜色的控制
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 设置必要的类信息

C++ 复制代码
Q_CLASSINFO("author","han")
Q_CLASSINFO("company","UPC")
Q_CLASSINFO("version","1.0.0")

2.2 通过元对象系统QMetaObject获取对应的类信息:

C++ 复制代码
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 设置必要的属性信息:

C++ 复制代码
//属性信息 类型  名称  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:对应的属性信息赋值方法

C++ 复制代码
//专门设计一个基于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获取设置的对应属性

C++ 复制代码
//即对应槽函数内部逻辑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获取相关的属性

C++ 复制代码
#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()));
    }
}
相关推荐
海南java第二人7 分钟前
SpringBoot启动流程深度解析:从入口到容器就绪的完整机制
java·开发语言
星火开发设计11 分钟前
C++ queue 全面解析与实战指南
java·开发语言·数据结构·c++·学习·知识·队列
DICOM医学影像19 分钟前
2. go语言从零实现以太坊客户端-查询区块链账户余额
开发语言·golang·区块链·以太坊·web3.0·hardhat
Data_agent30 分钟前
Python 编程实战:函数与模块化编程及内置模块探索
开发语言·python
new_zhou30 分钟前
vs2019+qt工程中生成dump文件及调试
开发语言·qt·visual studio·dump调试
栈与堆1 小时前
LeetCode 19 - 删除链表的倒数第N个节点
java·开发语言·数据结构·python·算法·leetcode·链表
一路向北·重庆分伦1 小时前
03-01:MQ常见问题梳理
java·开发语言
txinyu的博客1 小时前
结合游戏场景理解,互斥锁,读写锁,自旋锁,CAS / 原子变量,分段锁
开发语言·c++·游戏
阿里嘎多学长1 小时前
2026-01-11 GitHub 热点项目精选
开发语言·程序员·github·代码托管
yuanyikangkang1 小时前
STM32 lin控制盒
开发语言