QT 表單透明

來源:互聯網
上載者:User
【引用】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下面的內容加上半透效果,不是全透明效果。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.