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()));
    }
}
相关推荐
用户805533698034 天前
不止三件套:QObject 属性系统全关键字与运行时反射!
c++·qt
xcyxiner4 天前
DicomViewer (vcpkg Windows和ubuntu编译)7
qt
Quz9 天前
QML Hello World 入门示例
qt
xcyxiner12 天前
DicomViewer (dcmtk读取dcm文件)5
qt
xcyxiner13 天前
DicomViewer (后台线程处理文件)4
qt
xcyxiner13 天前
DicomViewer (添加模型类)3
qt
xcyxiner14 天前
DicomViewer (目录调整) 2
qt
xcyxiner14 天前
dcmtk vtk vtk-dicom(gdcm) 编译(debug) v2
qt
LDR00616 天前
Type-C 快充全面升级!LDR6601 赋能个人护理便携电机,重塑剃须刀 / 理发器新体验
c语言·开发语言
雪碧聊技术16 天前
Tree.js是什么?一文讲透
开发语言·javascript·ecmascript