当前位置: 首页 > news >正文

Qt5开发从入门到精通——第四篇(调色板)

欢迎小伙伴的点评✨✨,相互学习、互关必回、全天在线🍳🍳🍳
博主🧑🧑 本着开源的精神交流Qt开发的经验、将持续更新续章,为社区贡献博主自身的开源精神👩‍🚀

文章目录

  • 前言
  • 一、调色板概述
    • 1.1、QPalette类详细介绍
  • 二、效果实例
  • 三、原码解析
    • dialog.h
    • dialog.cpp
    • main.cpp
  • 四、总结


前言

本章节将会给大家带来调色板的详细使用方法


一、调色板概述

在实际应用中,经常需要改变某个控件的颜色外观,如背景、文字颜色等。 Qt 提供的调色板类 QPalette 专门用于管理对话框的外观显示。 QPalette 类相当千对话框或控件的调色板,它管理着控件或窗体的所有颜色信息。每个窗体或控件都包含一个QPalette 对象,在显示时,按照它的 QPalette 对象中对各部分各状态下的颜色的描述进行绘制。

1.1、QPalette类详细介绍

在本节中详细介绍 QPalette 类的使用方法,该类有两个基本的概念:一个是 ColorGroup,另一个是 ColorRole。其中,ColorGroup 指的是以下三种不同的状态。

  • QPalette::Active: 获得焦点的状态。
  • QPalette::Inactive: 未获得焦点的状态。
  • QPalette::Disable: 不可用状态。

其中, Active 状态与 Inactive 状态在通常情况下,颜色显示是一致的,也可以根据需要设置为不一样的颜色。
ColorRole 指的是颜色主题,即对窗体中不同部位颜色的分类。例如, QPalette:: Window 是指背景色, QPalette::WindowText 是指前景色,等等。
QPalette 类使用最多、最重要的函数是 setColor() 函数,其原型如下:

void QPalette:: setColor (ColorGroup group, ColorRole role, const QColor & color);

在对主题颜色进行设置的同时,还区分了状态,即对某个主题在某个状态下的颜色进行了设置:

void QPalette::setColor(ColorRole role,const QColor & color);

只对某个主题的颜色进行设置,并不区分状态。
QPalette 类同时还提供了 setBrush() 函数,通过画刷的设置对显示进行更改,这样就有可能使用图片而不仅是单一的颜色来对主题进行填充。 Qt 之前的版本中有关背景色设置的函数如setBackgroundColor()或前景色设置的函数如 setForegroundColor()在 Qt5 中都被废止,统一由QPalette 类进行管理。例如, setBackgroundColor() 函数可由以下语句代替:

xxx->setAutoFillBackground(true);
QPalette p = xxx->palette ();
p. setColor (QPalette: :Window, color) ; //p. setBrush (QPalette·: :Window, brush) ;
xxx->setPalette(p);

二、效果实例

在这里插入图片描述

三、原码解析

dialog.h

#ifndef DIALOG_H
#define DIALOG_H

#include <QDialog>
#include <QComboBox>
#include <QLabel>
#include <QTextEdit>
#include <QPushButton>
#include <QLineEdit>

class Dialog : public QDialog
{
    Q_OBJECT

public:
    Dialog(QWidget *parent = 0);
    ~Dialog();
    void createCtrlFrame();   //完成窗体左半部分颜色选择区的创建
    void createContentFrame() ; // 完成窗体右半部分的创建
    void fillColorList(QComboBox *); //完成向颜色下拉列表框中插入颜色的工作

private slots:
    void ShowWindow();
    void ShowWindowText();
    void ShowButton();
    void ShowButtonText();
    void ShowBase();

private:
    QFrame *ctrlFrame; //颜色选择板
    QLabel *windowLabe1;
    QComboBox *windowComboBox;
    QLabel *windowTextLabe1;
    QComboBox *windowTextComboBox;
    QLabel *buttonLabe1;
    QComboBox *buttonComboBox;
    QLabel *buttonTextLabel;
    QComboBox *buttonTextComboBox;
    QLabel *baseLabe1;
    QComboBox *baseComboBox;
    QFrame *contentFrame;    //具体显示面板
    QLabel *label1;
    QComboBox *comboBox1;
    QLabel *label2;
    QLineEdit *LineEdit2;
    QTextEdit *textEdit;
    QPushButton *OkBtn;
    QPushButton *CancelBtn;

};

#endif // DIALOG_H

dialog.cpp

#include "dialog.h"
#include <QHBoxLayout>
#include <QGridLayout>
Dialog::Dialog(QWidget *parent)
    : QDialog(parent)
{
    createCtrlFrame();
    createContentFrame();
    QHBoxLayout *mainLayout =new QHBoxLayout(this);
    mainLayout->addWidget(ctrlFrame);
    mainLayout->addWidget(contentFrame);
}

Dialog::~Dialog()
{

}
void Dialog::createCtrlFrame()
{
    ctrlFrame =new QFrame; //颜色选择面板
    windowLabe1 =new QLabel(tr("QPalette::Window: "));
    windowComboBox = new QComboBox;  //创建一个QComboBox对象
    fillColorList (windowComboBox);  //向下拉列表框中插入各种不同的颜色选项
    connect (windowComboBox, SIGNAL (activated(int)), this, SLOT (ShowWindow())); //连接下拉列表的activated()信号与改变背景色的槽函数
    windowTextLabe1 =new QLabel(tr("QPalette::WindowText: "));
    windowTextComboBox =new QComboBox;
    fillColorList(windowTextComboBox);
    connect(windowTextComboBox,SIGNAL(activated(int)),this,SLOT(ShowWindowText()));
    buttonLabe1 =new QLabel(tr("QPalette::Button: "));
    buttonComboBox =new QComboBox;
    fillColorList(buttonComboBox);
    connect (buttonComboBox, SIGNAL (activated(int)), this, SLOT (ShowButton()));
    buttonTextLabel =new QLabel(tr("QPalette: :ButtonText:"));
    buttonTextComboBox =new QComboBox;
    fillColorList(buttonTextComboBox);
    connect(buttonTextComboBox,SIGNAL(activated(int)),this,SLOT(ShowButtonText()));
    baseLabe1 =new QLabel(tr("QPalette::Base: "));
    baseComboBox =new QComboBox;
    fillColorList(baseComboBox);
    connect(baseComboBox,SIGNAL(activated(int)) ,this,SLOT(ShowBase()));
    QGridLayout *mainLayout=new QGridLayout(ctrlFrame);
    mainLayout->setSpacing(20);
    mainLayout->addWidget(windowLabe1,0,0);
    mainLayout->addWidget(windowComboBox,0,1);
    mainLayout->addWidget(windowTextLabe1,1,0);
    mainLayout->addWidget(windowTextComboBox,1,1);
    mainLayout->addWidget(buttonLabe1,2,0);
    mainLayout->addWidget(buttonComboBox,2,1);
    mainLayout->addWidget(buttonTextLabel,3,0);
    mainLayout->addWidget(buttonTextComboBox,3,1);
    mainLayout->addWidget(baseLabe1,4,0);
    mainLayout->addWidget(baseComboBox,4,1);

}

void Dialog::createContentFrame()
{
    contentFrame =new QFrame;      //具体显示面板
    label1 =new QLabel(tr("请选择一个值:"));
    comboBox1 =new QComboBox;
    label2 =new QLabel(tr("请输入字符串:"));
    LineEdit2 =new QLineEdit;
    textEdit =new QTextEdit;
    QGridLayout *TopLayout =new QGridLayout;
    TopLayout->addWidget(label1,0,0);
    TopLayout->addWidget(comboBox1,0,1);
    TopLayout->addWidget(label2,1,0);
    TopLayout->addWidget(LineEdit2,1,1);
    TopLayout->addWidget(textEdit,2,0,1,2);
    OkBtn =new QPushButton(tr("确认")) ;
    CancelBtn =new QPushButton(tr("取消")) ;
    QHBoxLayout *BottomLayout =new QHBoxLayout;
    BottomLayout->addStretch(1);
    BottomLayout->addWidget(OkBtn);
    BottomLayout->addWidget(CancelBtn);
    QVBoxLayout *mainLayout =new QVBoxLayout(contentFrame);
    mainLayout->addLayout(TopLayout);
    mainLayout->addLayout(BottomLayout);

}


void Dialog::ShowWindow()
{
    //获得当前选择的颜色值
    QStringList colorList = QColor::colorNames();
    QColor color= QColor(colorList[windowComboBox->currentIndex()]);
    QPalette p = contentFrame->palette();  //获得右部窗体contentFrame的调色板信息
    p.setColor(QPalette::Window, color); //设置 contentFrame 窗体的 Window 类颜色,即背景色,
                                         //setColor() 的第一个参数为设置的颜色主题,第二个参数为具体的颜色值。
    //把修改后的调色板信息应用到contentFrame窗体中,更新显示
    contentFrame->setPalette(p);
    contentFrame->update();

}
void Dialog::ShowWindowText()
{
    QStringList colorList = QColor::colorNames ();
    QColor color= colorList[windowTextComboBox->currentIndex()];
    QPalette p = contentFrame->palette();
    p.setColor(QPalette::WindowText,color);
    contentFrame->setPalette(p);
}

void Dialog::ShowButton()
{
    QStringList colorList = QColor::colorNames();
    QColor color =QColor(colorList[buttonComboBox->currentIndex()]);
    QPalette p = contentFrame->palette();
    p.setColor(QPalette::Button,color);
    contentFrame->setPalette(p);
    contentFrame->update () ;

}
void Dialog::ShowButtonText()
{
    QStringList colorList = QColor::colorNames ();
    QColor color= QColor(colorList[buttonTextComboBox->currentIndex()]);
    QPalette p =contentFrame->palette();
    p.setColor(QPalette::ButtonText,color);
    contentFrame->setPalette(p);
}

void Dialog::ShowBase()
{
    QStringList colorList = QColor::colorNames();
    QColor color= QColor(colorList[baseComboBox->currentIndex()]);
    QPalette p = contentFrame->palette();
    p.setColor(QPalette::Base, color);
    contentFrame->setPalette(p);

}

void Dialog::fillColorList(QComboBox *comboBox)
{
    QStringList colorList = QColor::colorNames();  //获得 Qt 所有内置名称的颜色名列表,返回的是一个字符串列表 colorList 。
    QString color;                                 //新建一个 QString 对象,为循环遍历做准备。
    foreach(color,colorList)                       //对颜色名列表进行遍历
    {
        QPixmap pix(QSize(70,20));                 //新建一个 QPixmap 对象 pix 作为显示颜色的图标。
        pix.fill(QColor(color));                   //为pix填充当前遍历的颜色
        comboBox->addItem(QIcon(pix), NULL);       //调用 QComboBox 的 additemO 函数为下拉列表框插入一个条目,
                                                   //并以准备好的 pix 作为插入条目的图标,名称设为 NULL, 即不显示颜色的名称。
        comboBox->setIconSize(QSize(70, 20));      //设置图标的尺寸,图标默认尺寸是一个方形,将它设置为与 pix 尺寸相同的长方形。
        comboBox->setSizeAdjustPolicy(QComboBox::AdjustToContents); //设置下拉列表框的尺寸调整策略为 AdjustToContents (符合内容的大小)。

    }
}

main.cpp

#include "dialog.h"
#include <QApplication>

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    Dialog w;
    w.show();

    return a.exec();
}


四、总结

调色板会在应用程序开发中经常用到的

相关文章:

  • MySQL数据库如何线上修改表结构
  • Python利用pandas获取每行最大值和最小值
  • C++设计模式之装饰者模式(结构型模式)
  • 数据结构中,索引存储和散列存储区别较为详细的介绍
  • 基于ssm+vue的邮票收藏鉴赏系统 elementui
  • 去中心化标志符在DID中的核心地位
  • C++设计模式之适配器模式(结构型模式)
  • 3-面试官:说说线程池的 7 大参数
  • 猿创征文|HCIE-Security Day50:网络攻击介绍
  • 一个基于NetCore开发的前后端分离CMS系统
  • centos7安装docker和docker-compose
  • 子查询与内联结分别应该怎么写?
  • Shell编程之第一讲——基础知识认识
  • Java-基于SSM的校园点餐管理系统
  • WLAN与WiFi各是什么意思有什么区别
  • 【划重点】MySQL技术内幕:InnoDB存储引擎
  • Bytom交易说明(账户管理模式)
  • canvas 五子棋游戏
  • echarts的各种常用效果展示
  • Git同步原始仓库到Fork仓库中
  • IDEA 插件开发入门教程
  • Netty+SpringBoot+FastDFS+Html5实现聊天App(六)
  • node.js
  • python_bomb----数据类型总结
  • vue数据传递--我有特殊的实现技巧
  • XForms - 更强大的Form
  • 浮动相关
  • 基于axios的vue插件,让http请求更简单
  • 离散点最小(凸)包围边界查找
  • 如何邀请好友注册您的网站(模拟百度网盘)
  • 译米田引理
  • 直播平台建设千万不要忘记流媒体服务器的存在 ...
  • #Lua:Lua调用C++生成的DLL库
  • #QT项目实战(天气预报)
  • #Z2294. 打印树的直径
  • (14)Hive调优——合并小文件
  • (C#)获取字符编码的类
  • (Matalb分类预测)GA-BP遗传算法优化BP神经网络的多维分类预测
  • (二十一)devops持续集成开发——使用jenkins的Docker Pipeline插件完成docker项目的pipeline流水线发布
  • (翻译)terry crowley: 写给程序员
  • (经验分享)作为一名普通本科计算机专业学生,我大学四年到底走了多少弯路
  • (九)c52学习之旅-定时器
  • (译) 理解 Elixir 中的宏 Macro, 第四部分:深入化
  • (转载)OpenStack Hacker养成指南
  • .Net 4.0并行库实用性演练
  • .NET 4.0网络开发入门之旅-- 我在“网” 中央(下)
  • .Net 高效开发之不可错过的实用工具
  • .net6Api后台+uniapp导出Excel
  • :not(:first-child)和:not(:last-child)的用法
  • @param注解什么意思_9000字,通俗易懂的讲解下Java注解
  • [ vulhub漏洞复现篇 ] ThinkPHP 5.0.23-Rce
  • []Telit UC864E 拨号上网
  • [2016.7.test1] T2 偷天换日 [codevs 1163 访问艺术馆(类似)]
  • [20181219]script使用小技巧.txt
  • [Android Studio 权威教程]断点调试和高级调试