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


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


    前言

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


    一、调色板概述

    在实际应用中,经常需要改变某个控件的颜色外观,如背景、文字颜色等。 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);
    
    • 1

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

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

    只对某个主题的颜色进行设置,并不区分状态。
    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);
    
    • 1
    • 2
    • 3
    • 4

    二、效果实例

    在这里插入图片描述

    三、原码解析

    dialog.h

    #ifndef DIALOG_H
    #define DIALOG_H
    
    #include 
    #include 
    #include 
    #include 
    #include 
    #include 
    
    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
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53

    dialog.cpp

    #include "dialog.h"
    #include 
    #include 
    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 (符合内容的大小)。
    
        }
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
    • 65
    • 66
    • 67
    • 68
    • 69
    • 70
    • 71
    • 72
    • 73
    • 74
    • 75
    • 76
    • 77
    • 78
    • 79
    • 80
    • 81
    • 82
    • 83
    • 84
    • 85
    • 86
    • 87
    • 88
    • 89
    • 90
    • 91
    • 92
    • 93
    • 94
    • 95
    • 96
    • 97
    • 98
    • 99
    • 100
    • 101
    • 102
    • 103
    • 104
    • 105
    • 106
    • 107
    • 108
    • 109
    • 110
    • 111
    • 112
    • 113
    • 114
    • 115
    • 116
    • 117
    • 118
    • 119
    • 120
    • 121
    • 122
    • 123
    • 124
    • 125
    • 126
    • 127
    • 128
    • 129
    • 130
    • 131
    • 132
    • 133
    • 134
    • 135
    • 136
    • 137
    • 138
    • 139
    • 140
    • 141
    • 142
    • 143
    • 144
    • 145
    • 146
    • 147
    • 148
    • 149

    main.cpp

    #include "dialog.h"
    #include 
    
    int main(int argc, char *argv[])
    {
        QApplication a(argc, argv);
        Dialog w;
        w.show();
    
        return a.exec();
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12

    四、总结

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

  • 相关阅读:
    R语言在气象、水文中数据处理及结果分析、绘图
    阿里三年功能测试的一些感悟
    Day08 SSM第八次笔记---SpringBoot基础部分学习
    Android 11 系统开发增加低电量弹窗提示 手机 平板 车载 TV 投影 通用
    Javaweb之javascript的详细解析
    非线性最小二乘-高斯牛顿法
    Leetcode 剑指 Offer II 004. 只出现一次的数字
    多测师肖sir___ddt讲解(辅助框架)
    mysql数据库中mysql database 数据被破坏产生的一系列问题
    Kafka学习
  • 原文地址:https://blog.csdn.net/weixin_44759598/article/details/126674491