Qt實現FlatUI樣式(開源)

對於如今作前端開發人員來講,FlatUI確定不陌生,最近幾年扁平化的設計愈來愈流行,大概因爲如今PC端和移動端的設備的分辨率愈來愈高,扁平化反而看起來更讓人愉悅,而經過漸變色產生的質感色彩反而沒有扁平化來得親切。 css

Flat UI是基於Bootstrap之上進行二次開發的扁平化前端框架,他提供了動感、時尚的風格色調搭配,簡潔、炫麗的功能組件,同時還提供了更爲平滑的js交互動畫,能夠稱得上前端扁平化設計框架的優秀表明之一。 前端

既然是扁平化設計框架的優秀表明,固然須要在本身項目中應用應用,本人最先使用VB開發,然後轉爲C#開發,最後轉爲Qt開發,都是由於公司項目須要,根據須要不斷學習新的編程框架,語言都是相通的,觸類旁通,之前用C#寫的vista時鐘控件和vista日曆控件,稍微改改就轉移成了Qt寫的對應控件,很是方便,只要掌握了思想,熟練了一門語言和框架以後,其餘的學起來特別快。 編程

Qt中的qss機制,和css極爲類似,感受就是脫胎於css,用qss來實現Qt界面樣式不是通常的方便,而是至關的爽,在看到FlatUI這樣的精美的扁平化設計樣式後,難以抑制手癢癢,就想用qss實現相似的風格。前端框架

 

第一步:實現按鈕風格app

按鈕在大部分的可視化界面的項目中,出現的頻率不是第一也是第二,因此首先來實現按鈕對應的flat UI 扁平化風格。框架

根據官網的效果看,基本上要實現的就三種狀態(正常狀態+鼠標懸停狀態+鼠標按下)(還有一種禁用狀態)的兩種顏色(背景色+前景色)的設置,前景色通常指的是文字顏色。ide

將改變對應按鈕樣式風格封裝成一個函數,這樣每次調用只需傳入對應參數便可。函數

void frmMain::setBtnQss(QPushButton *btn,

                        QString normalColor, QString normalTextColor,

                        QString hoverColor, QString hoverTextColor,

                        QString pressedColor, QString pressedTextColor)

{

         QStringList qss;

         qss.append(QString("QPushButton{border-style:none;padding:10px;border-radius:5px;color:%1;background:%2;}").arg(normalTextColor).arg(normalColor));

         qss.append(QString("QPushButton:hover{color:%1;background:%2;}").arg(hoverTextColor).arg(hoverColor));

         qss.append(QString("QPushButton:pressed{color:%1;background:%2;}").arg(pressedTextColor).arg(pressedColor));

         btn->setStyleSheet(qss.join(""));

}

使用時調用:工具

setBtnQss(ui->btn1, "#34495E", "#FFFFFF", "#4E6D8C", "#F0F0F0", "#2D3E50", "#B8C6D1");

setBtnQss(ui->btn2, "#1ABC9C", "#E6F8F5", "#2EE1C1", "#FFFFFF", "#16A086", "#A7EEE6");

setBtnQss(ui->btn3, "#3498DB", "#FFFFFF", "#5DACE4", "#E5FEFF", "#2483C7", "#A0DAFB");

setBtnQss(ui->btn4, "#E74C3C", "#FFFFFF", "#EC7064", "#FFF5E7", "#DC2D1A", "#F5A996");

第二步:實現文本輸入框的風格學習

根據官網的效果看,基本上就是兩種狀態(正常狀態+得到焦點狀態)的兩種顏色(邊框顏色+文字顏色)的設置。

void frmMain::setTxtQss(QLineEdit *txt, QString normalColor, QString focusColor)

{

         QStringList qss;

         qss.append(QString("QLineEdit{border-style:none;padding:6px;border-radius:5px;border:2px solid %1;}").arg(normalColor));

         qss.append(QString("QLineEdit:focus{border:2px solid %1;}").arg(focusColor));

         txt->setStyleSheet(qss.join(""));

}

使用時調用:

setTxtQss(ui->txt1, "#DCE4EC", "#34495E");

setTxtQss(ui->txt2, "#DCE4EC", "#1ABC9C");

setTxtQss(ui->txt3, "#DCE4EC", "#3498DB");

setTxtQss(ui->txt4, "#DCE4EC", "#E74C3C");

第三步:實現進度條的風格

根據官網的效果看,基本上就是兩種顏色(正常背景色+當前值背景色)的設置。

void frmMain::setBarQss(QProgressBar *bar, QString normalColor, QString chunkColor)

{

    int barHeight = 8;

    int barRadius = 8;

 

         QStringList qss;

    qss.append(QString("QProgressBar{font:9pt;height:%2px;background:%1;border-radius:%3px;text-align:center;border:1px solid %1;}").arg(normalColor).arg(barHeight).arg(barRadius));

    qss.append(QString("QProgressBar:chunk{border-radius:%2px;background-color:%1;}").arg(chunkColor).arg(barRadius));

         bar->setStyleSheet(qss.join(""));

}

使用時調用:

setBarQss(ui->bar1, "#E8EDF2", "#E74C3C");

setBarQss(ui->bar2, "#E8EDF2", "#1ABC9C");

第四步:實現滑塊條的風格

根據官網的效果看,基本上就是三種顏色(默認背景色+當前值背景色+滑塊顏色)的設置。

這裏爲了好看,特地將滑塊改爲圓形,這樣更好看些。

void frmMain::setSliderQss(QSlider *slider, QString normalColor, QString grooveColor, QString handleColor)

{

         int sliderHeight = 8;

    int sliderRadius = 4;

         int handleWidth = 13;

         int handleRadius = 6;

         int handleOffset = 3;

 

         QStringList qss;

         qss.append(QString("QSlider::groove:horizontal,QSlider::add-page:horizontal{height:%2px;border-radius:%3px;background:%1;}").arg(normalColor).arg(sliderHeight).arg(sliderRadius));

         qss.append(QString("QSlider::sub-page:horizontal{height:%2px;border-radius:%3px;background:%1;}").arg(grooveColor).arg(sliderHeight).arg(sliderRadius));

         qss.append(QString("QSlider::handle:horizontal{width:%2px;margin-top:-%3px;margin-bottom:-%3px;border-radius:%4px;"

                            "background:qradialgradient(spread:pad,cx:0.5,cy:0.5,radius:0.5,fx:0.5,fy:0.5,stop:0.6 #FFFFFF,stop:0.8 %1);}")

                    .arg(handleColor).arg(handleWidth).arg(handleOffset).arg(handleRadius));

    slider->setStyleSheet(qss.join(""));

}

使用時調用:

setSliderQss(ui->slider1, "#E8EDF2", "#1ABC9C", "#1ABC9C");

setSliderQss(ui->slider2, "#E8EDF2", "#E74C3C", "#E74C3C");

依次下去,還能夠實現單選框、複選框、開關按鈕等控件的樣式。

其實在整個過程當中和界面設計效果看,有一個核心就是顏色的搭配,不少人可能會問,我怎麼知道那個顏色值是多少,推薦一個工具,綠色小巧無污染,叫屏幕拾色器,是要按住吸管往你看到的頁面地方移動過去,就會自動將該顏色的值吸過來顯示。我本身也用Qt實現過相似的這樣一個小工具。

 

最終效果圖:

 

完整源碼下載:http://download.csdn.net/detail/feiyangqingyun/9708136

除了qss樣式控制外觀外,還有一種辦法也能夠實現相似效果,並且更靈活,那就是自定義控件,用Qpainter重繪外觀,尤爲是高級控件的話用qss就很難實現,下面就是我重繪的一些自定義控件。

相關文章
相關標籤/搜索