Mega Code Archive

 
Categories / C++ / Qt
 

Widget style

/**************************************************************************** ** ** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies). ** All rights reserved. ** Contact: Nokia Corporation (qt-info@nokia.com) ** ** This file is part of the examples of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial Usage ** Licensees holding valid Qt Commercial licenses may use this file in ** accordance with the Qt Commercial License Agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Nokia. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file.  Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Nokia gives you certain additional ** rights.  These rights are described in the Nokia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file.  Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** If you have questions regarding the use of this file, please contact ** Nokia at qt-info@nokia.com. ** $QT_END_LICENSE$ ** ****************************************************************************/ #ifndef WIDGETGALLERY_H #define WIDGETGALLERY_H #include <QDialog> QT_BEGIN_NAMESPACE class QCheckBox; class QComboBox; class QDateTimeEdit; class QDial; class QGroupBox; class QLabel; class QLineEdit; class QProgressBar; class QPushButton; class QRadioButton; class QScrollBar; class QSlider; class QSpinBox; class QTabWidget; class QTableWidget; class QTextEdit; QT_END_NAMESPACE class WidgetGallery : public QDialog {     Q_OBJECT public:     WidgetGallery(QWidget *parent = 0); private slots:     void changeStyle(const QString &styleName);     void changePalette();     void advanceProgressBar(); private:     void createTopLeftGroupBox();     void createTopRightGroupBox();     void createBottomLeftTabWidget();     void createBottomRightGroupBox();     void createProgressBar();     QPalette originalPalette;       QLabel *styleLabel;     QComboBox *styleComboBox;     QCheckBox *useStylePaletteCheckBox;     QCheckBox *disableWidgetsCheckBox;     QGroupBox *topLeftGroupBox;     QRadioButton *radioButton1;     QRadioButton *radioButton2;     QRadioButton *radioButton3;     QCheckBox *checkBox;     QGroupBox *topRightGroupBox;     QPushButton *defaultPushButton;     QPushButton *togglePushButton;     QPushButton *flatPushButton;     QTabWidget *bottomLeftTabWidget;     QTableWidget *tableWidget;     QTextEdit *textEdit;     QGroupBox *bottomRightGroupBox;     QLineEdit *lineEdit;     QSpinBox *spinBox;     QDateTimeEdit *dateTimeEdit;     QSlider *slider;     QScrollBar *scrollBar;     QDial *dial;     QProgressBar *progressBar; }; #endif #include <QtGui> #include "norwegianwoodstyle.h" #include "widgetgallery.h" WidgetGallery::WidgetGallery(QWidget *parent)     : QDialog(parent) {     originalPalette = QApplication::palette();     styleComboBox = new QComboBox;     styleComboBox->addItem("NorwegianWood");     styleComboBox->addItems(QStyleFactory::keys());     styleLabel = new QLabel(tr("&Style:"));     styleLabel->setBuddy(styleComboBox);     useStylePaletteCheckBox = new QCheckBox(tr("&Use style's standard palette"));     useStylePaletteCheckBox->setChecked(true);     disableWidgetsCheckBox = new QCheckBox(tr("&Disable widgets"));     createTopLeftGroupBox();     createTopRightGroupBox();     createBottomLeftTabWidget();     createBottomRightGroupBox();     createProgressBar();     connect(styleComboBox, SIGNAL(activated(const QString &)),               this, SLOT(changeStyle(const QString &)));     connect(useStylePaletteCheckBox, SIGNAL(toggled(bool)),             this, SLOT(changePalette()));     connect(disableWidgetsCheckBox, SIGNAL(toggled(bool)),             topLeftGroupBox, SLOT(setDisabled(bool)));     connect(disableWidgetsCheckBox, SIGNAL(toggled(bool)),             topRightGroupBox, SLOT(setDisabled(bool)));     connect(disableWidgetsCheckBox, SIGNAL(toggled(bool)),             bottomLeftTabWidget, SLOT(setDisabled(bool)));     connect(disableWidgetsCheckBox, SIGNAL(toggled(bool)),             bottomRightGroupBox, SLOT(setDisabled(bool)));     QHBoxLayout *topLayout = new QHBoxLayout;       topLayout->addWidget(styleLabel);     topLayout->addWidget(styleComboBox);     topLayout->addStretch(1);     topLayout->addWidget(useStylePaletteCheckBox);     topLayout->addWidget(disableWidgetsCheckBox);     QGridLayout *mainLayout = new QGridLayout;     mainLayout->addLayout(topLayout, 0, 0, 1, 2);     mainLayout->addWidget(topLeftGroupBox, 1, 0);     mainLayout->addWidget(topRightGroupBox, 1, 1);     mainLayout->addWidget(bottomLeftTabWidget, 2, 0);     mainLayout->addWidget(bottomRightGroupBox, 2, 1);     mainLayout->addWidget(progressBar, 3, 0, 1, 2);     mainLayout->setRowStretch(1, 1);     mainLayout->setRowStretch(2, 1);     mainLayout->setColumnStretch(0, 1);     mainLayout->setColumnStretch(1, 1);     setLayout(mainLayout);     setWindowTitle(tr("Styles"));     changeStyle("NorwegianWood"); } void WidgetGallery::changeStyle(const QString &styleName)   {     if (styleName == "NorwegianWood") {         QApplication::setStyle(new NorwegianWoodStyle);     } else {         QApplication::setStyle(QStyleFactory::create(styleName));     }     changePalette(); } void WidgetGallery::changePalette()   {     if (useStylePaletteCheckBox->isChecked())         QApplication::setPalette(QApplication::style()->standardPalette());     else         QApplication::setPalette(originalPalette); } void WidgetGallery::advanceProgressBar()   {     int curVal = progressBar->value();     int maxVal = progressBar->maximum();     progressBar->setValue(curVal + (maxVal - curVal) / 100); } void WidgetGallery::createTopLeftGroupBox()   {     topLeftGroupBox = new QGroupBox(tr("Group 1"));     radioButton1 = new QRadioButton(tr("Radio button 1"));     radioButton2 = new QRadioButton(tr("Radio button 2"));     radioButton3 = new QRadioButton(tr("Radio button 3"));     radioButton1->setChecked(true);     checkBox = new QCheckBox(tr("Tri-state check box"));     checkBox->setTristate(true);     checkBox->setCheckState(Qt::PartiallyChecked);     QVBoxLayout *layout = new QVBoxLayout;     layout->addWidget(radioButton1);     layout->addWidget(radioButton2);     layout->addWidget(radioButton3);     layout->addWidget(checkBox);     layout->addStretch(1);     topLeftGroupBox->setLayout(layout); } void WidgetGallery::createTopRightGroupBox() {     topRightGroupBox = new QGroupBox(tr("Group 2"));     defaultPushButton = new QPushButton(tr("Default Push Button"));     defaultPushButton->setDefault(true);     togglePushButton = new QPushButton(tr("Toggle Push Button"));     togglePushButton->setCheckable(true);     togglePushButton->setChecked(true);     flatPushButton = new QPushButton(tr("Flat Push Button"));     flatPushButton->setFlat(true);     QVBoxLayout *layout = new QVBoxLayout;     layout->addWidget(defaultPushButton);     layout->addWidget(togglePushButton);     layout->addWidget(flatPushButton);     layout->addStretch(1);     topRightGroupBox->setLayout(layout); } void WidgetGallery::createBottomLeftTabWidget() {     bottomLeftTabWidget = new QTabWidget;     bottomLeftTabWidget->setSizePolicy(QSizePolicy::Preferred,                                        QSizePolicy::Ignored);     QWidget *tab1 = new QWidget;     tableWidget = new QTableWidget(10, 10);     QHBoxLayout *tab1hbox = new QHBoxLayout;     tab1hbox->setMargin(5);     tab1hbox->addWidget(tableWidget);     tab1->setLayout(tab1hbox);     QWidget *tab2 = new QWidget;     textEdit = new QTextEdit;     textEdit->setPlainText(tr("Twinkle, twinkle, little star,\n"                               "How I wonder what you are.\n"                               "Up above the world so high,\n"                               "Like a diamond in the sky.\n"                               "Twinkle, twinkle, little star,\n"                               "How I wonder what you are!\n"));                           QHBoxLayout *tab2hbox = new QHBoxLayout;     tab2hbox->setMargin(5);     tab2hbox->addWidget(textEdit);     tab2->setLayout(tab2hbox);     bottomLeftTabWidget->addTab(tab1, tr("&Table"));     bottomLeftTabWidget->addTab(tab2, tr("Text &Edit")); } void WidgetGallery::createBottomRightGroupBox() {     bottomRightGroupBox = new QGroupBox(tr("Group 3"));     bottomRightGroupBox->setCheckable(true);     bottomRightGroupBox->setChecked(true);     lineEdit = new QLineEdit("s3cRe7");     lineEdit->setEchoMode(QLineEdit::Password);     spinBox = new QSpinBox(bottomRightGroupBox);     spinBox->setValue(50);     dateTimeEdit = new QDateTimeEdit(bottomRightGroupBox);     dateTimeEdit->setDateTime(QDateTime::currentDateTime());     slider = new QSlider(Qt::Horizontal, bottomRightGroupBox);     slider->setValue(40);     scrollBar = new QScrollBar(Qt::Horizontal, bottomRightGroupBox);     scrollBar->setValue(60);     dial = new QDial(bottomRightGroupBox);     dial->setValue(30);     dial->setNotchesVisible(true);     QGridLayout *layout = new QGridLayout;     layout->addWidget(lineEdit, 0, 0, 1, 2);     layout->addWidget(spinBox, 1, 0, 1, 2);     layout->addWidget(dateTimeEdit, 2, 0, 1, 2);     layout->addWidget(slider, 3, 0);     layout->addWidget(scrollBar, 4, 0);     layout->addWidget(dial, 3, 1, 2, 1);     layout->setRowStretch(5, 1);     bottomRightGroupBox->setLayout(layout); } void WidgetGallery::createProgressBar() {     progressBar = new QProgressBar;     progressBar->setRange(0, 10000);     progressBar->setValue(0);     QTimer *timer = new QTimer(this);     connect(timer, SIGNAL(timeout()), this, SLOT(advanceProgressBar()));     timer->start(1000); } #ifndef NORWEGIANWOODSTYLE_H #define NORWEGIANWOODSTYLE_H #include <QMotifStyle> #include <QPalette> QT_BEGIN_NAMESPACE class QPainterPath; QT_END_NAMESPACE class NorwegianWoodStyle : public QMotifStyle {     Q_OBJECT public:     NorwegianWoodStyle() {}     void polish(QPalette &palette);     void polish(QWidget *widget);     void unpolish(QWidget *widget);     int pixelMetric(PixelMetric metric, const QStyleOption *option,                     const QWidget *widget) const;     int styleHint(StyleHint hint, const QStyleOption *option,                   const QWidget *widget, QStyleHintReturn *returnData) const;     void drawPrimitive(PrimitiveElement element, const QStyleOption *option,                        QPainter *painter, const QWidget *widget) const;     void drawControl(ControlElement control, const QStyleOption *option,                      QPainter *painter, const QWidget *widget) const; private:     static void setTexture(QPalette &palette, QPalette::ColorRole role,                            const QPixmap &pixmap);     static QPainterPath roundRectPath(const QRect &rect); }; #endif #include <QtGui> #include "norwegianwoodstyle.h" void NorwegianWoodStyle::polish(QPalette &palette) {     QColor brown(212, 140, 95);     QColor beige(236, 182, 120);     QColor slightlyOpaqueBlack(0, 0, 0, 63);     QPixmap backgroundImage(":/images/woodbackground.png");     QPixmap buttonImage(":/images/woodbutton.png");     QPixmap midImage = buttonImage;     QPainter painter;     painter.begin(&midImage);     painter.setPen(Qt::NoPen);     painter.fillRect(midImage.rect(), slightlyOpaqueBlack);     painter.end();     palette = QPalette(brown);     palette.setBrush(QPalette::BrightText, Qt::white);     palette.setBrush(QPalette::Base, beige);     palette.setBrush(QPalette::Highlight, Qt::darkGreen);     setTexture(palette, QPalette::Button, buttonImage);     setTexture(palette, QPalette::Mid, midImage);     setTexture(palette, QPalette::Window, backgroundImage);     QBrush brush = palette.background();     brush.setColor(brush.color().dark());     palette.setBrush(QPalette::Disabled, QPalette::WindowText, brush);     palette.setBrush(QPalette::Disabled, QPalette::Text, brush);     palette.setBrush(QPalette::Disabled, QPalette::ButtonText, brush);     palette.setBrush(QPalette::Disabled, QPalette::Base, brush);     palette.setBrush(QPalette::Disabled, QPalette::Button, brush);     palette.setBrush(QPalette::Disabled, QPalette::Mid, brush); } void NorwegianWoodStyle::polish(QWidget *widget)   {     if (qobject_cast<QPushButton *>(widget)             || qobject_cast<QComboBox *>(widget))         widget->setAttribute(Qt::WA_Hover, true); } void NorwegianWoodStyle::unpolish(QWidget *widget)   {     if (qobject_cast<QPushButton *>(widget)             || qobject_cast<QComboBox *>(widget))         widget->setAttribute(Qt::WA_Hover, false); } int NorwegianWoodStyle::pixelMetric(PixelMetric metric,                                       const QStyleOption *option,                                     const QWidget *widget) const {     switch (metric) {     case PM_ComboBoxFrameWidth:         return 8;     case PM_ScrollBarExtent:         return QMotifStyle::pixelMetric(metric, option, widget) + 4;     default:         return QMotifStyle::pixelMetric(metric, option, widget);     } } int NorwegianWoodStyle::styleHint(StyleHint hint, const QStyleOption *option,                                     const QWidget *widget,                                   QStyleHintReturn *returnData) const {     switch (hint) {     case SH_DitherDisabledText:         return int(false);     case SH_EtchDisabledText:         return int(true);     default:         return QMotifStyle::styleHint(hint, option, widget, returnData);     } } void NorwegianWoodStyle::drawPrimitive(PrimitiveElement element,                                          const QStyleOption *option,                                        QPainter *painter,                                        const QWidget *widget) const {     switch (element) {     case PE_PanelButtonCommand:         {             int delta = (option->state & State_MouseOver) ? 64 : 0;             QColor slightlyOpaqueBlack(0, 0, 0, 63);             QColor semiTransparentWhite(255, 255, 255, 127 + delta);             QColor semiTransparentBlack(0, 0, 0, 127 - delta);             int x, y, width, height;             option->rect.getRect(&x, &y, &width, &height);             QPainterPath roundRect = roundRectPath(option->rect);               int radius = qMin(width, height) / 2;             QBrush brush;               bool darker;             const QStyleOptionButton *buttonOption =                     qstyleoption_cast<const QStyleOptionButton *>(option);             if (buttonOption                     && (buttonOption->features & QStyleOptionButton::Flat)) {                 brush = option->palette.background();                 darker = (option->state & (State_Sunken | State_On));             } else {                 if (option->state & (State_Sunken | State_On)) {                     brush = option->palette.mid();                     darker = !(option->state & State_Sunken);                 } else {                     brush = option->palette.button();                     darker = false;                   }               }             painter->save();               painter->setRenderHint(QPainter::Antialiasing, true);               painter->fillPath(roundRect, brush);               if (darker)                   painter->fillPath(roundRect, slightlyOpaqueBlack);             int penWidth;               if (radius < 10)                 penWidth = 3;             else if (radius < 20)                 penWidth = 5;             else                 penWidth = 7;             QPen topPen(semiTransparentWhite, penWidth);             QPen bottomPen(semiTransparentBlack, penWidth);             if (option->state & (State_Sunken | State_On))                 qSwap(topPen, bottomPen);             int x1 = x;             int x2 = x + radius;             int x3 = x + width - radius;             int x4 = x + width;             if (option->direction == Qt::RightToLeft) {                 qSwap(x1, x4);                 qSwap(x2, x3);             }             QPolygon topHalf;             topHalf << QPoint(x1, y)                     << QPoint(x4, y)                     << QPoint(x3, y + radius)                     << QPoint(x2, y + height - radius)                     << QPoint(x1, y + height);             painter->setClipPath(roundRect);             painter->setClipRegion(topHalf, Qt::IntersectClip);             painter->setPen(topPen);             painter->drawPath(roundRect);               QPolygon bottomHalf = topHalf;             bottomHalf[0] = QPoint(x4, y + height);             painter->setClipPath(roundRect);             painter->setClipRegion(bottomHalf, Qt::IntersectClip);             painter->setPen(bottomPen);             painter->drawPath(roundRect);             painter->setPen(option->palette.foreground().color());             painter->setClipping(false);             painter->drawPath(roundRect);             painter->restore();         }         break;       default:           QMotifStyle::drawPrimitive(element, option, painter, widget);     } } void NorwegianWoodStyle::drawControl(ControlElement element,                                        const QStyleOption *option,                                      QPainter *painter,                                      const QWidget *widget) const {     switch (element) {     case CE_PushButtonLabel:         {             QStyleOptionButton myButtonOption;             const QStyleOptionButton *buttonOption =                     qstyleoption_cast<const QStyleOptionButton *>(option);             if (buttonOption) {                 myButtonOption = *buttonOption;                 if (myButtonOption.palette.currentColorGroup()                         != QPalette::Disabled) {                     if (myButtonOption.state & (State_Sunken | State_On)) {                         myButtonOption.palette.setBrush(QPalette::ButtonText,                                 myButtonOption.palette.brightText());                     }                 }             }             QMotifStyle::drawControl(element, &myButtonOption, painter, widget);         }         break;     default:         QMotifStyle::drawControl(element, option, painter, widget);     } } void NorwegianWoodStyle::setTexture(QPalette &palette, QPalette::ColorRole role,                                       const QPixmap &pixmap) {     for (int i = 0; i < QPalette::NColorGroups; ++i) {         QColor color = palette.brush(QPalette::ColorGroup(i), role).color();         palette.setBrush(QPalette::ColorGroup(i), role, QBrush(color, pixmap));     } } QPainterPath NorwegianWoodStyle::roundRectPath(const QRect &rect)   {     int radius = qMin(rect.width(), rect.height()) / 2;     int diam = 2 * radius;     int x1, y1, x2, y2;     rect.getCoords(&x1, &y1, &x2, &y2);     QPainterPath path;     path.moveTo(x2, y1 + radius);     path.arcTo(QRect(x2 - diam, y1, diam, diam), 0.0, +90.0);     path.lineTo(x1 + radius, y1);     path.arcTo(QRect(x1, y1, diam, diam), 90.0, +90.0);     path.lineTo(x1, y2 - radius);     path.arcTo(QRect(x1, y2 - diam, diam, diam), 180.0, +90.0);     path.lineTo(x1 + radius, y2);     path.arcTo(QRect(x2 - diam, y2 - diam, diam, diam), 270.0, +90.0);     path.closeSubpath();     return path; } #include <QApplication> #include "widgetgallery.h" int main(int argc, char *argv[]) {     Q_INIT_RESOURCE(styles);     QApplication app(argc, argv);     WidgetGallery gallery;     gallery.show();     return app.exec(); }