{
Q_OBJECT
public:
Dialog(QWidget *parent = 0);
~Dialog();
}
{
//創建個LineEdit用來測試焦點
QLineEdit* le = new QLineEdit(this);
}
Dialog::~Dialog()
{
}
{
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單純的背景調色板:
pal.setColor(QPalette::Background, QColor(100,100,100,50));
w.setPalette(pal);
w.setAutoFillBackground(true);
但是還沒大功告成,不停點擊桌面,再點擊這個窗口,會發現這個窗口越來越不透明,直至完全不透明瞭。不知道是不是qt的bug。
3.3轉戰paintEvent()
void paintEvent(QPaintEvent *);
{
QPainter p(this);
p.fillRect(rect(), QColor(0,0xff,0,30));
}
3.4setAttribute(Qt::WA_TranslucentBackground, true) + paintEvent()
運行效果:
得到了設想中的效果。
最終的主函數代碼:
{
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();
}
{
//創建個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下面的內容加上半透效果,不是全透明效果。