Qt貼圖與Qss快速入門(一)
- 2020 年 4 月 7 日
- 筆記
前兩次和大家分享了Qml繪製儀錶盤、Qt自定義控件繪製儀錶盤,我是更傾向使用Qml這種方式的。自定義控件使用到了定時器,如果有多個控件的話,那豈不是要使用很多定時器?還有就是對於界面前端本身不是要花特別多精力的地方,掌握通用的幾種方法就好。
這兩天學習了對Qt界面如何美化——QSS,按照我自己的思路仿了一個對初學者友好的Demo。參考對象是從github上下載的一個模仿360界面的,源碼較多,所以我按照自己的習慣仿照了一個極簡版的。

大佬的

我的
其實寫了這麼久的程序,我是不用樣式表的。主要注重功能,但想要成為一名Qt開發工程師,樣式表是基本技能。
程序平台:Windows、 Qt5.5.1(MinGW)
一、 幾個界面類之間的關係
Dialog類是承載其他幾個類的基本。其他幾個類分別是MainTopWidget、MainBottomWidget以及SafeWidget。對應我的界面就是「立即體檢」的綠色部分、下面三個按鈕的灰色部分以及點擊第一個按鈕跳轉到的部分。
下載的程序是用純代碼寫的,但我的都是使用Qt Designer來做的。
二、界面布局以及簡單樣式表使用
1. MainTopWidget
MainTopWidget繼承自QWidget。
這是直接在Widget中設置的樣式,要注意的是QWidget直接派生類的樣式表是不起作用的,原因是QWidget的paintEvent()是空的,而樣式表要通過paint被繪製到窗口中。解決方法如下:
void MainTopWidget::paintEvent(QPaintEvent *) { QStyleOption opt; opt.init(this); QPainter p(this); style()->drawPrimitive(QStyle::PE_Widget, &opt, &p, this); }

2. MainBottomWidget
MainBottomWidget也是直接繼承自QWidget。

對按鈕設置樣式
//從下往上 從右往左 從上往下 從左往右 數第n個像素的位置 ui->pbn_safeCheck->setStyleSheet( "border-image:url(:/resource/safe_check)0 285 0 0");
這裡要提一下的是safe_check.png圖片是4張連在一起的,所以在設置樣式表時需要將圖片分割,取出需要使用的圖片,這裏面取出來的是第一張圖片。下面是設置完樣式之後的效果,彷彿開了美顏之後的自己、彷彿是化了妝後的自己~ 看來我之前寫的程序都是素顏的啊!

3. SafeWidget
SafeWidget也是直接繼承自QWidget。
這裏面先說下,為了要實現「動畫」的效果,分別對這幾個Widget設置了固定的尺寸以便讓它們按照我們設置的位置去移動。
這幾個窗體中,當點擊按鈕時,會將發出信號,在Dialog窗體中將信號與槽連接起來。

4. Dialog窗體
該窗體中主要實現了動畫的效果,還有就是將需要的信號和槽進行連接。
實現動畫的效果:
void Dialog::initAnim() { QPropertyAnimation *m_upMainAnimation = new QPropertyAnimation(m_topWidget, "pos"); m_upMainAnimation->setDuration(200); m_upMainAnimation->setStartValue(QPoint(0, 0)); m_upMainAnimation->setEndValue(QPoint(0, -440)); QPropertyAnimation *m_downMainAnimation = new QPropertyAnimation(m_bottomWidget, "pos"); m_downMainAnimation->setDuration(200); m_downMainAnimation->setStartValue(QPoint(0, 440)); m_downMainAnimation->setEndValue(QPoint(0, 600)); m_upGroup = new QParallelAnimationGroup; m_upGroup->addAnimation(m_upMainAnimation); m_upGroup->addAnimation(m_downMainAnimation); QPropertyAnimation *m_upGarAnimation = new QPropertyAnimation(m_topWidget, "pos"); m_upGarAnimation->setDuration(400); m_upGarAnimation->setStartValue(QPoint(0, -440)); m_upGarAnimation->setEndValue(QPoint(0, 0)); QPropertyAnimation *m_downGarAnimation = new QPropertyAnimation(m_bottomWidget, "pos"); m_downGarAnimation->setDuration(400); m_downGarAnimation->setStartValue(QPoint(0, 600)); m_downGarAnimation->setEndValue(QPoint(0, 440)); m_downGroup = new QParallelAnimationGroup; m_downGroup->addAnimation(m_upGarAnimation); m_downGroup->addAnimation(m_downGarAnimation); }
詳細的內容可以參考該鏈接:https://www.pressc.cn/63.html
三、 小結
現在的學習方式漸漸變為以目的為導向的學習,個人覺得這樣的方式可以做到快速提高,或者說就是以項目為導向。然後再從項目中反思總結。
下次有時間會把這個Demo再完善一些,還會將樣式表寫入文件,這樣可以將樣式與界面設計分離。
最後的效果視頻如下:
http://mpvideo.qpic.cn/0bf2v4aamaaa5yalzc4aqrpfbl6da2xqabqa.f10002.mp4?dis_k=0a51312531674becf5a8e451af70b941&dis_t=1586226180


