【引用】Qt中設置窗口的透明

QT 窗體透明

分類: QT美化動態化 802人閱讀 評論(3) 收藏 舉報

【引用】Qt中設置窗口的透明   Qt

|字號 訂閱

本文引用自/yl守望/love《Qt中設置窗口的透明》一、將Qt窗口嵌入到桌面中。
聲明一個最簡單的類:
class Dialog : public QDialog
{
 Q_OBJECT

public:
 Dialog(QWidget *parent = 0);
 ~Dialog();
}
函數實現:
Dialog::Dialog(QWidget *parent) : QDialog(parent)
{
 //創建個LineEdit用來測試焦點
 QLineEdit* le = new QLineEdit(this);
}

Dialog::~Dialog()
{
}
主函數:
int main(int argc, char *argv[])
{
 QApplication a(argc, argv);
 Dialog w;

HWND desktopHwnd = findDesktopIconWnd();
 if(desktopHwnd) SetParent(w.winId(), desktopHwnd);

w.show();
 return a.exec();
}
運行效果:

有個窗口嵌入了桌面。按win+D組合鍵可以看到此窗口在桌面上。

二、讓窗口全透明:
2.1最容易想到的就是setWindowOpacity()函數了。
w.setWindowOpacity(0.5),運行:結果杯具了,此函數完全無效,因爲其父窗口特殊,這個函數內部使用的系統窗口標誌不被支持。
2.2
w.setAttribute(Qt::WA_TranslucentBackground, true);
運行效果:

全透明ok。如果其父窗口爲空的話,透明的地方會成爲黑塊。

三、讓窗口半透明
3.1w.setAttribute(Qt::WA_TranslucentBackground, true) + 背景調色板
運行效果仍然是全透明,因爲TranslucentBackground爲true,根本不畫背景。
3.2單純的背景調色板:
QPalette pal = w.palette();
 pal.setColor(QPalette::Background, QColor(100,100,100,50));
 w.setPalette(pal);
 w.setAutoFillBackground(true);
運行效果出現了半透明:

但是還沒大功告成,不停點擊桌面,再點擊這個窗口,會發現這個窗口越來越不透明,直至完全不透明瞭。不知道是不是qt的bug。
3.3轉戰paintEvent()
protected:
 void paintEvent(QPaintEvent *);
void Dialog::paintEvent(QPaintEvent *e)
{
 QPainter p(this);
 p.fillRect(rect(), QColor(0,0xff,0,30));
}
用一個帶有alpha值的顏色填充背景,運行效果發現顏色確實有alpha值,但是桌面的內容透不過來。
3.4setAttribute(Qt::WA_TranslucentBackground, true) + paintEvent()
運行效果:

得到了設想中的效果。
最終的主函數代碼:
int main(int argc, char *argv[])
{
 QApplication a(argc, argv);
 Dialog w;

HWND desktopHwnd = findDesktopIconWnd();
 if(desktopHwnd) SetParent(w.winId(), desktopHwnd);

w.setAttribute(Qt::WA_TranslucentBackground, true);

w.show();
 return a.exec();
}
最終的dialog實現代碼:
Dialog::Dialog(QWidget *parent) : QWidget(parent)
{
 //創建個LineEdit用來測試焦點
 QLineEdit* le = new QLineEdit(this);
}

Dialog::~Dialog()
{
}

void Dialog::paintEvent(QPaintEvent *e)
{
 QPainter p(this);
 p.fillRect(rect(), QColor(0,0xff,0,30));
}


PS:
經測試此代碼在XP運行不正常。窗口成爲黑色背景塊。只能是顏色半透明瞭。
還有就是圖標會被蓋住。

在QT中自繪控件的方法說明 收藏 
首先給出在QT中進行標題欄自繪的方法(兩個網址給出了方法和參考代碼)

litterflybug的專欄 ::http://blog.csdn.net/litterflybug/archive/2009/05/07/4157482.aspx

QT官方FAQ: http://www.qtsoftware.com/developer/faqs/faq.2007-04-25.2011048382

其次,做一點關於在windows平臺下將頂級窗口透明化的說明

1.在4.5版本以前,要實現Top level窗口的透明化,需要使用setMask方法,該方法有兩個重載,一個是QRegion定義一個區域表明這一區域是要被繪製的區域,在該區域以外的地方是不需要繪製的.第二個重載版本是需要一個QBitmap,這個QBitmap只需要一張單色位圖就可以了(另外,一張帶有透明效果的PNG圖片被讀入QPixmap中以後,可以使用函數mask()返回一張與原圖對應的單色位圖,這很方便實際使用),白色部分表示是不透明要被繪製的區域,黑色部分表示該區域不應該被繪製(能實現透明的效果).

2.4.5版本發行以後,可以設置窗口屬性Qt::WA_TranslucentBackground來設定該窗口透明顯示,但是有一個問題,就是如果該窗口是個top level窗口,就會有標題欄(title bar), 在windows平臺下,如果不把這個標題欄去掉(設置Qt::FramelessWindowHint 標誌位就會去掉標題欄),那麼將不會是透明效果,而是背景爲全黑(我的實驗結果是這樣)


本文部分來自CSDN博客,轉載請標明出處:http://blog.csdn.net/dotboy/archive/2009/06/22/4287805.aspx

http://blog.163.com/chengyujie0524@126/blog/static/36569717201161592816551/




1.窗口整體透明,但是窗體上的控件不透明。
   通過設置窗體的背景色來實現,將背景色設置爲全透。
QPalette pal = palette(); 
pal.setColor(QPalette::Background, QColor(0x00,0xff,0x00,0x00)); 
setPalette(pal);
   試驗效果:

 

   窗體標題欄不透明;
   窗體客戶區上的控件不透明,QLabel控件只是字顯示,控件背景色透明;
   窗體客戶區完全透明。
 
   另外從網上看到的方法:
setAttribute(Qt::WA_TranslucentBackground, true);
   試驗的結果是類似於上面的方法,www.linuxidc.com但有時候窗體會被一些雜色斑點填充,未找到原因。
 
2.窗口及其上面的控件都半透明:
setWindowOpacity(0.7)
試驗效果:窗口及控件都半透明。
 
3.窗口整體不透明,局部透明:
在Paint事件中使用Clear模式繪圖。
void TestWindow::paintEvent( QPaintEvent* ) 

                QPainter p(this); 
                p.setCompositionMode( QPainter::CompositionMode_Clear ); 
                p.fillRect( 10, 10, 300, 300, Qt::SolidPattern ); 

試驗效果:繪製區域全透明。如果繪製區域有控件不會影響控件。
 
 
以上實驗均是基於Directfb的Qte測試。在Linux下及Windows下效果會略有不同。
比如在Windows下第3個實驗,繪製區域就是一個黑窟窿,如果Window本身半透,則是Window下面的內容加上半透效果,不是全透明效果。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章