【引用】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下面的內容加上半透效果,不是全透明效果。