Qt實現FlatUI樣式(開源)


對於現在做前端開發人員來說,FlatUI肯定不陌生,最近幾年扁平化的設計越來越流行,大概由於現在PC端和移動端的設備的分辨率越來越高,扁平化反而看起來更讓人愉悅,而通過漸變色產生的質感色彩反而沒有扁平化來得親切。 

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

既然是扁平化設計框架的優秀代表,當然需要在自己項目中應用應用,本人最早使用VB開發,而后轉為C#開發,最后轉為Qt開發,都是因為公司項目需要,根據需要不斷學習新的編程框架,語言都是相通的,舉一反三,以前用C#寫的vista時鍾控件和vista日歷控件,稍微改改就轉移成了Qt寫的對應控件,非常方便,只要掌握了思想,熟練了一門語言和框架之后,其他的學起來特別快。 

Qt中的qss機制,和css極為相似,感覺就是脫胎於css,用qss來實現Qt界面樣式不是一般的方便,而是相當的爽,在看到FlatUI這樣的精美的扁平化設計樣式后,難以抑制手癢癢,就想用qss實現類似的風格。

 

第一步:實現按鈕風格

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

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

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

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就很難實現,下面就是我重繪的一些自定義控件。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM