歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
Linux教程網 >> Linux綜合 >> Linux資訊 >> 更多Linux >> Qt 不規則窗體的實現

Qt 不規則窗體的實現

日期:2017/2/27 9:23:43   编辑:更多Linux

QQread原文:http://www.Linux-ren.org/modules/newbb/viewtopic.PHP?topic_id=2185&forum=15

准備兩個圖,一個是要顯示在窗體的圖片,一個是蒙板,蒙板的黑色部分是要保留的,白色是要去掉的。 我准備了2張圖,要顯示的圖片是"tmp.png",蒙板是"mask.png".如圖下面的程序都有個毛病,不能拖出幕窗口以外,為什麼呢?請注意一個是窗口和MASK圖片的大小問題,還有就是只有無拖動欄的窗體MASK成不規則窗體才允許拖出屏幕窗口以外。GTK程序參考 gtk_widget_shape_combine_mask

使用 Qt 制作 SKIN: http://www-128.ibm.com/developer ... /qt/skin/index.HtmlSkin(表皮) 是制作比較酷的軟件界面的有利工具. 一個軟件可以同時使用多種Skin 以取得不同的外觀, 使同一個軟件有截然不同的風格. 用戶可以根據自己的喜好選擇 不同的風格. 本節介紹使用 Qt 制作 Skin 的方法.軟件界面的風格變化可以通過兩種機制完成,一種是通過設置主題(Themes),它使用 界面庫本身所具有的對界面組件(Components)的控制能力切換顯示風格;另外一種是 通過提供不同系列的圖片來切換顯示界面,即這裡所講的 Skin。制作表皮有幾個重要的因素值得考慮:1. 使用無邊界的窗口在 XWindow 下,無邊界的窗口是指不受窗口管理器管理的邊界不規則的窗口。由於不受窗口管理器管理管理,所以軟件窗口界面沒有附加的標題條(Title Bar)等。 在Qt中,建立無邊界窗口的最簡單的方法 是設置 QWidget 的 WFlags 的值是 WStyle_NoBorder。它定義在 qnamespace.h 中。不規則窗口的特點則要求對整個 窗口使用圖像掩碼。使用 X 窗口形狀的擴展(X Shape Extension)來達到要求。在 Qt 中可以直接使用,QBitmap bm;bm = *(Pixmaps[MASK]);setMask(bm);setBackgroundPixmap(*Pixmaps[BACKGROUND]);2. 窗口的移動由於上述窗口不受窗口管理器的管理的特性,所以移動窗口需要特殊處理,一般的 方法是截取根Widget的鼠標按鈕事件,自己處理鼠標點擊和移動的事件。void SkinDemo::mouseMoveEvent(QMouseEvent *e){QPoint newpos = e->globalPos();QPoint upleft = pos0 + newpos - last;move(upleft);}void SkinDemo::mousePressEvent(QMouseEvent *e){last = e->globalPos();pos0 = e->globalPos() - e->pos();}這裡我們取得的鼠標位置是絕對位置,即相對於根窗口的位置,同時也記錄下窗口 左上角的位置,當鼠標移動時,取得新的絕對位置,則窗口左上角 的新位置應該 是原來位置與鼠標移動的位置之差。3. 按鈕的制作在 例子( qt-skin-example.tar.gz) 中,我們重新定義了鼠標按下和鼠標移動的事件處理 函數,並且含有按鈕的所有信息,主工作區的所有信息等。主工作區的信息是它的位置和尺寸,主窗口的信息是它所使用的背景圖片和圖片的掩碼(用來制造不規則 窗口),所以整個主窗口的大小可以由圖片的尺寸來決定。幾個按鈕的信息包含它們的 位置,它們的大小由圖片的大小來決定。對於表皮中的圖像按鈕, 設置它的父類是 QButton,這種按鈕由兩幅圖片構成,一幅圖片是正常狀態(Normal),一幅圖片是按鈕按下時的狀態(Activated)。有時也可以設置成四 種狀態,即增加禁止狀態(Disabled)和鼠標指針進入時的狀態 (Hovered)。

Qt3 的手工代碼實現: CODE: #include <qapplication.h>#include <qwidget.h>#include <qpixmap.h>#include <qbitmap.h>#include <qpoint.h>class myclass:public QWidget{ public: myclass(); protected: void mouseMoveEvent(QMouseEvent *e); void mousePressEvent(QMouseEvent *e); private: QPixmap *pixmap; QBitmap *bitmap; QPoint last,pos0;};myclass::myclass(){ setGeometry(0,0,120,120); pixmap=new QPixmap("/doc/test/a/tmp.png"); bitmap=new QBitmap("/doc/test/a/mask.png"); setPaletteBackgroundPixmap(*pixmap); setMask(*bitmap);}void myclass::mouseMoveEvent(QMouseEvent *e){ if(e->state()==LeftButton) { QPoint newpos = e->globalPos(); QPoint upleft = pos0 + newpos - last; move(upleft); }}void myclass::mousePressEvent(QMouseEvent *e){ last = e->globalPos(); pos0 = e->globalPos() - e->pos();} int main(int argc,char *argv[]){ QApplication a(argc,argv); myclass w; a.setMainWidget(&w); w.show(); return a.exec();} QQread.com 推出各大專業服務器評測 Linux服務器的安全性能 SUN服務器 HP服務器 DELL服務器 IBM服務器 聯想服務器 浪潮服務器 曙光服務器 同方服務器 華碩服務器 寶德服務器

Qt4的手工代碼實現,注意差別:

CODE: #include <QApplication>#include <QWidget>#include <QPixmap>#include <QBitmap>#include <QPoint>#include <QPalette>#include <QMouseEvent>class myclass:public QWidget{ public: myclass(); protected: void mouseMoveEvent(QMouseEvent *e); void mousePressEvent(QMouseEvent *e); private: QPixmap *pixmap; QBitmap *bitmap; QPoint last,pos0;};myclass::myclass(){ setGeometry(0,0,120,120); pixmap=new QPixmap("/doc/test/a/tmp.png"); bitmap=new QBitmap("/doc/test/a/mask.png"); QPalette palette; palette.setBrush(backgroundRole(), QBrush(*pixmap)); setPalette(palette); setMask(*bitmap);}void myclass::mouseMoveEvent(QMouseEvent *e){ if (!(e->buttons() & Qt::LeftButton)) return; QPoint newpos = e->globalPos(); QPoint upleft = pos0 + newpos - last; move(upleft);}void myclass::mousePressEvent(QMouseEvent *e){ if (e->button() == Qt::LeftButton) last = e->globalPos(); pos0 = e->globalPos() - e->pos();}int main(int argc,char *argv[]){ QApplication a(argc,argv); myclass w; w.show(); return a.exec();}




Copyright © Linux教程網 All Rights Reserved