Qt之对话框设计——利用QPalette改变控件颜色
QPalette类相当于对话框或控件的调色板,它管理着控件或窗体的所有颜色信息,每个窗体或控件都包含一个QPalette对象,在显示时按照它的QPalette对象中对各部分各状态下的颜色的描述来进行绘制。
QPalette类有两个基本的概念,一个是ColorGroup,另一个是ColorRole。
void QPalette::setColor ( ColorRole role, const QColor & color );
void QPalette::setColor ( ColorGroup group, ColorRole role, const QColor & color );
void QPalette::setBrush ( ColorRole role, const QBrush & brush );
void QPalette::setBrush ( ColorGroup group, ColorRole role, const QBrush & brush );
ColorGroup:
QPalette::Disabled | 不可用状态 |
QPalette::Active | 活跃状态(获得焦点) |
QPalette::Inactive | 不活跃状态(未获得焦点) |
ColorRole:
QPalette::Window | 一个常规的背景颜色 |
QPalette::Background | 这个值是废弃的,使用window代替 |
QPalette::WindowText | 一个一般的前景颜色 |
QPalette::Foreground | 这个值是废弃的,使用windowText代替. |
QPalette::Base | 最长使用来作为text背景颜色为整个widget,但是也能被用来为其他的绘画,像combobox的上下清单的背景和工具栏句柄。它通常是白的或者其他亮的颜色. |
QPalette::AlternateBase | 被用来作为轮流的背景颜色,轮流的行颜色 |
QPalette::ToolTipBase | 被用来作为背景颜色为QToolTip和QWhatsThis。工具尖端使用QPalette不活跃的颜色组,因为工具尖端不是活跃的窗口. |
QPalette::ToolTipText | 被用来作为前景颜色为QToolTip和QWhatsThis.工具尖端使用QPalette不活跃的颜色组,因为工具尖端不是活跃的窗口. |
QPalette::Text | 前景颜色使用base.这通常和windowText相同,它一定提供好的对比window和base |
QPalette::Button | button背景颜色。这个背景颜色能是不同于window作为一些风格,要求一个不同的背景颜色作为button |
QPalette::ButtonText | 一个前景颜色被用来作为button颜色. |
QPalette::BrightText | 一个text颜色是很不同于windowText,很好的对比与dark。典型的被用来为text,需要被画,在text或者windowText将给差的对比,就像在按下的button。注意text颜色能被用来为事情,而不只是单词;text颜色通常被用来为text,但是他是相当普通的使用text颜色角色为行,图标,等等。 |
另外,在设置对话框和控件的背景色时还会用到:
void setAutoFillBackground ( bool enabled );
maindlg.h
#ifndef MAINDLG_H #define MAINDLG_H #include <QtGui/QDialog> #include <QFrame> #include <QComboBox> class MainDlg : public QDialog { Q_OBJECT public: MainDlg(QWidget *parent = 0, Qt::WFlags flags = 0); ~MainDlg(); void createCtrlFrame(); void createContentFrame(); void fillColorList(QComboBox *); public slots: void sl_window(); void sl_windowText(); void sl_button(); void sl_buttonText(); void sl_base(); private: QFrame *ctrlFrame; //颜色选择面板 QFrame *contentFrame; //具体显示面板 QComboBox *cbbWindow; QComboBox *cbbWindowText; QComboBox *cbbButton; QComboBox *cbbButtonText; QComboBox * cbbBase; }; #endif // MAINDLG_H
maindlg.cpp
#include "maindlg.h" #include <QPalette> #include <QHBoxLayout> #include <QVBoxLayout> #include <QGridLayout> #include <QStringList> #include <QColor> #include <QPixmap> #include <QSpinBox> #include <QTextEdit> #include <QLineEdit> #include <QPushButton> #include <QLabel> MainDlg::MainDlg(QWidget *parent, Qt::WFlags flags) : QDialog(parent, flags) { createCtrlFrame(); createContentFrame(); QHBoxLayout *mainLayout = new QHBoxLayout(this); mainLayout->addWidget(ctrlFrame); mainLayout->addWidget(contentFrame); mainLayout->setMargin(10); mainLayout->setSpacing(5); mainLayout->setSizeConstraint(QLayout::SetFixedSize); } MainDlg::~MainDlg() { } void MainDlg::fillColorList(QComboBox *cbb) { QStringList colorNameList = QColor::colorNames(); QString colorName; foreach(colorName,colorNameList) { QPixmap pix_color(70,20); pix_color.fill(QColor(colorName)); cbb->addItem(QIcon(pix_color),NULL); cbb->setIconSize(QSize(70,20)); cbb->setSizeAdjustPolicy(QComboBox::AdjustToContents); //设置下拉列表的尺寸符合内容的大小 } } void MainDlg::createCtrlFrame() { ctrlFrame = new QFrame; QLabel *labWindow = new QLabel(tr("QPalette::Window:")); QLabel *labWindowText = new QLabel(tr("QPalette::WindowText:")); QLabel *labButton = new QLabel(tr("QPalette::Button:")); QLabel *labButtonText = new QLabel(tr("QPalette::ButtonText:")); QLabel *labBase = new QLabel(tr("QPalette::Base:")); cbbWindow = new QComboBox; fillColorList(cbbWindow); connect(cbbWindow,SIGNAL(activated(int)),this,SLOT(sl_window())); cbbWindowText = new QComboBox; fillColorList(cbbWindowText); connect(cbbWindowText,SIGNAL(activated(int)),this,SLOT(sl_windowText())); cbbButton = new QComboBox; fillColorList(cbbButton); connect(cbbButton,SIGNAL(activated(int)),this,SLOT(sl_button())); cbbButtonText = new QComboBox; fillColorList(cbbButtonText); connect(cbbButtonText,SIGNAL(activated(int)),this,SLOT(sl_buttonText())); cbbBase = new QComboBox; fillColorList(cbbBase); connect(cbbBase,SIGNAL(activated(int)),this,SLOT(sl_base())); int col_lab = 0; int col_cbb = 1; QGridLayout *ctrlLayout = new QGridLayout(ctrlFrame); ctrlLayout->addWidget(labWindow,0,col_lab); ctrlLayout->addWidget(labWindowText,1,col_lab); ctrlLayout->addWidget(labButton,2,col_lab); ctrlLayout->addWidget(labButtonText,3,col_lab); ctrlLayout->addWidget(labBase,4,col_lab); ctrlLayout->addWidget(cbbWindow,0,col_cbb); ctrlLayout->addWidget(cbbWindowText,1,col_cbb); ctrlLayout->addWidget(cbbButton,2,col_cbb); ctrlLayout->addWidget(cbbButtonText,3,col_cbb); ctrlLayout->addWidget(cbbBase,4,col_cbb); ctrlLayout->setMargin(5); ctrlLayout->setSpacing(5); } void MainDlg::createContentFrame() { contentFrame = new QFrame; QLabel *labValue = new QLabel(tr("Please select one of the values:")); QSpinBox *spbValue = new QSpinBox; QHBoxLayout *valueLayout = new QHBoxLayout; valueLayout->addWidget(labValue); valueLayout->addWidget(spbValue); valueLayout->setSpacing(5); QLabel *labString = new QLabel(tr("Please input a string")); QLineEdit *edtString = new QLineEdit; QHBoxLayout *stringLayout = new QHBoxLayout; stringLayout->addWidget(labString); stringLayout->addWidget(edtString); stringLayout->setSpacing(5); QTextEdit *edtHelloQt = new QTextEdit(tr("Hello Qt!")); QPushButton *btnOk = new QPushButton(tr("OK")); QPushButton *btnCancel =new QPushButton(tr("Cancel")); QHBoxLayout *buttonLayout = new QHBoxLayout; buttonLayout->addStretch(1); buttonLayout->addWidget(btnOk); buttonLayout->addWidget(btnCancel); buttonLayout->setSpacing(5); QVBoxLayout *contentLayout = new QVBoxLayout(contentFrame); contentLayout->addLayout(valueLayout); contentLayout->addLayout(stringLayout); contentLayout->addWidget(edtHelloQt); contentLayout->addLayout(buttonLayout); contentLayout->setMargin(5); contentLayout->setSpacing(5); btnOk->setAutoFillBackground(true); btnCancel->setAutoFillBackground(true); contentFrame->setAutoFillBackground(true); } void MainDlg::sl_window() { QStringList colorList = QColor::colorNames(); QColor color = QColor(colorList[cbbWindow->currentIndex()]); QPalette p = contentFrame->palette(); p.setColor(QPalette::Window,color); contentFrame->setPalette(p); } void MainDlg::sl_windowText() { QStringList colorList = QColor::colorNames(); QColor color = QColor(colorList[cbbWindowText->currentIndex()]); QPalette p = contentFrame->palette(); p.setColor(QPalette::WindowText,color); contentFrame->setPalette(p); } void MainDlg::sl_button() { QStringList colorNameList = QColor::colorNames(); QColor m_color = QColor(colorNameList[cbbButton->currentIndex()]); QPalette p = contentFrame->palette(); p.setColor(QPalette::Button,m_color); contentFrame->setPalette(p); } void MainDlg::sl_buttonText() { QStringList colorNameList = QColor::colorNames(); QColor m_color = QColor(colorNameList[cbbButtonText->currentIndex()]); QPalette p = contentFrame->palette(); p.setColor(QPalette::ButtonText,m_color); contentFrame->setPalette(p); } void MainDlg::sl_base() { QStringList colorNameList = QColor::colorNames(); QColor m_color = QColor(colorNameList[cbbBase->currentIndex()]); QPalette p = contentFrame->palette(); p.setColor(QPalette::Base,m_color); contentFrame->setPalette(p); }
作者:韩兆新
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。