close

日前為了設置半透明背景
做了一些試驗

開發環境Fedora, 使用Qt.4.7.2版本
編譯完的GUI執行檔在Linux機器上跑..

{ qrc檔遇到的小問題心得 }
 
若"編譯"與"編輯"使用不同QT版本(還是跟Fedora與Window OS差別有關?), 可能會造成qrc檔圖檔連結有錯誤, 在機器上跑GUI顯示不出來

事情是這樣的:
原本我的fedora開發環境中, QT是使用4.7.2版本
但因為開發環境是架設在VMare, 
而..在VMware中使用QT編輯器, 實在跑很慢又很鈍=  =
所以我開了分享資料夾, 將我的GUI code放在分享資料夾裡, 在Window下使用QT4.7.4版本"編輯" GUI code
而且還直接使用QT4.7.4去新增qrc圖檔
發現!!!
編譯完的執行檔會無法顯示出圖檔
直接在VMware中用QT新增qrc圖檔或在VMware中使用終端機去vi編輯qrc檔就正常了


 
{ 設置半透明背景 }  
要先自行準備有半透明效果的圖 (我是直接用fedora裡的GNU圖片處理程式)
而且要注意, 在Window7下瀏覽圖片半透明效果看起來是灰色的, 全透效果看起來則是白色的
只有在fedora下瀏覽才會看得出來
 
我必須說..一 切 都 是 試 驗 的 結 果
很多原因我並不知道是為什麼><

首先一個最古怪的事情
每個UI 頁面與其上面所有的物件之間要加上一層QGroupBox, 顯示半透明頁面才會正常
要不然會出現全透效果 =口= (這到底是什麼鬼啦)
 
你可以選擇在UI (也許是QWidget也許是QFrame)加入半透明背景圖, 也可以選擇在GroupBox加入半透明背景圖
而另一個就在StyleSheet中設定以下  
background-image: url(:none);
(其實應該不設也可以, 保險起見設一下)
 
 
A. 一般頁面(一個UI僅一個QWidget, 較單純)
一般頁面的話效果還算正常
只需要如上面所說的, 將Widget 或GroupBox 放入半透明效果的背景圖, 並且在建構子中設定半透明屬性就可以了, 
(廢話: 你想墊在下面有朦朧美的舊頁面請不要hide()) 

設定半透明屬性程式碼: 

this->setAttribute(Qt::WA_TranslucentBackground,true);
this->setAutoFillBackground(true);
this->setAttribute(Qt::WA_NoSystemBackground,true);
/*從QT官網看的reference說若設定TranslucentBackground屬性的話必須加上NoSystemBackground屬性*/

 

另外也必須設Window Flag:
setWindowFlags(Qt::FramelessWindowHint);
(其他屬性我不管XD印象中這個是必須要加的)
 

另外, 在widget上面的物件如按鈕或QLabel 等是使用背景全透的圖 
( 由於QToolButtom 等物件一定是矩形 
 但我們可能為了美美的視覺效果, 矩形buttom 中只有部分區域是不透明的, 例如圓圓的按鈕
  那麼根據公式計算, 若toolButtom是長寬皆為 a 的正方形
  整個面積扣掉圓型按鈕(a/2)*(a/2)*π 後
  有a*a - (a/2)*(a/2)*π 的面積你要弄成透明的哈哈哈
  
)
為了保險起見, 物件的background可設置於StyleSheet

border-image:url(:/..你的qrc路徑../你的圖檔名);background-image:url(:none);

by the way
border可讓圖片自動配合長寬去調整, 會塞得剛剛好
而background則是僅對齊左上角(0,0) (以物件為座標, 非widget)  
  



 
 
B. 使用QStackedWidget (UI 中有多個page, 問題較多)
我的狀況: 
 多個pages中, 一頁是母選單(非透明背景), 
 其他pages是進階子選單(皆使用半透明背景 -> 背景要看得到朦朧美的母選單)
 

若使用QStackedWidget很多層頁面的話問題會比較多 
(只是我沒找到原因, 問題應該是有規律的才對)

除了stackedwidget中的每一個page都需要有GroupBox並且擇其一放入半透明效果的背景圖(當然Window Flag也要設)之外, 
page與groupBox都要設定半透明屬性(應該(喂))
並且在page中的QToolbuttom等物件必須全部都要各自使用半透明效果背景(不能同A使用全透背景)並且各自設定半透明屬性
( 以前面的圓圓按鈕的例子來說
  有a*a - (a/2)*(a/2)*π 的面積你需要弄成半透明的
  否則在機器上跑會有a*a - (a/2)*(a/2)*π 的面積出現全透效果(崩潰)
  )
很奇怪很奇怪很奇怪啊啊啊啊啊啊啊 

 
並且還有一個要注意
你要設屬性的地方是show出page的前一刻!!!!!!!(例如 stackedWidget->setCurrentIndex(PageID); 的上面一行
所有物件包括widget和groupBox的屬性要重新設一次 
如果只有在建構子設的話, 切換page秀出來的時候仍然會無半透明效果
所以其實在一開始建構子的時候不設也沒關係() 
那些落落長的屬性只要setCurrentIndex的前一刻設就好了

我猜這會不會和下面討論的東西有關(我猜通常都不準):
 
半透明背景越來越深的問題
查到網路上有人說QT4.?.? 本身有這個問題(還有人說QT5有改善? 怎又有論壇說QT4沒遇到, 但灌了QT5就有這問題..)
就是每當物件接收事件後(例如QToolButtom的click(), 或者QLabel的setText()..)
物件就會重畫(repaint/update)一次, 而且是無清空直接疊上去, 造成物件區域中的半透明背景越來越黑...
( 以前面的圓圓按鈕的例子來說 
  有a*a - (a/2)*(a/2)*π 的面積會因為你多按幾次就變成黑色=  =
  
) 

而我在A. 也就是UI 僅一個widget的狀況不會發生這個問題, 
也就是多個pages會發生!!! 
 

QToolbuttom半透明背景越來越深的解決方法就是在顯示(show出畫面)之前, 對那個buttom設置 setUpdatesEnabled(false);
如此一來即使觸發了按下按鈕之類的事件, 也不會重畫了(但缺點也是你不能重畫按鈕什麼的, 只要牽涉到影響畫面的都不行)
在要離開(hide)之前要設置回 setUpdatesEnabled(true); 要不然下次show出畫面, 按鈕就不會出現了XD
QLabel的解決方法還沒找到
畢竟QLabel最主要的就是要做顯示...除非它只單純掛個圖或文字在那裡, 不需要更新畫面
 


接下來是Hebe完全無法理解的崩潰時間之

"按!!這到底是怎麼一回事"之QLabel一秀出就半透明背景是深的!!

上面一切都做到了!!stackedWidget也很開心的每一頁都秀出半透明效果了!!(除了母選單(廢話))
但page裡的QLabel 區域竟然一秀出來背景就已經變深了!!!!
它隔壁的toolButtom半透明效果明明很正常啊!!!!
到底是怎麼一回事啊!!?

解決方法:
在stackedWidget層的外(上)面加上一個Qlabel物件(我猜可能其他物件也可以, 但我剛好用QLabel)
(也就是讓那個label 不屬於在stackedwidget裡面, 而在更上層)
就正常了這到底是怎麼一回事??

(但我感覺應該是和物件擺放在不同的"上下層次"有關
甚至我覺得需要使用GroupBox, 半透明才會正常出現, 也是和物件的層次有關)

 
還有待磨練啊啊..

arrow
arrow
    全站熱搜

    lynn770707 發表在 痞客邦 留言(0) 人氣()