2011-08-06 84 views
4

我需要創建一個透明的透明控件,它基本上是一個帶有陰影的導航欄,下面的小部件需要通過陰影部分可見。小部件加載一個PNG,然後在繪畫事件中繪製它。問題在於陰影全是黑色,並且不是透明的。如何製作一個透明的QWidget

這是代碼我目前使用:

NavigationBar::NavigationBar(QWidget *parent) : XQWidget(parent) { 
    backgroundPixmap_ = new QPixmap(); 
    backgroundPixmap_->load(FilePaths::skinFile("NavigationBarBackground.png"), "png"); 

    setAttribute(Qt::WA_NoBackground, true); // This is supposed to remove the background but there's still a (black) background 
} 


void NavigationBar::paintEvent(QPaintEvent* event) { 
    QWidget::paintEvent(event); 

    QPainter painter(this); 
    int x = 0; 
    while (x < width()) { 
     painter.drawPixmap(x, 0, backgroundPixmap_->width(), backgroundPixmap_->height(), *backgroundPixmap_); 
     x += backgroundPixmap_->width(); 
    } 
} 

有誰知道我需要改變,以確保部件是真的透明?

回答

1

你正在做的工作太多了:-)

setAttribute通話是沒有必要的。默認情況下,小部件不會在其背景上繪製任何東西(假設Qt> = 4.1)。調用QWidget::paintEvent也是不必要的 - 你不希望它做任何事情。

,而不是做的圖案填充自己,讓Qt的有QBrush做到這一點:

NavigationBar::NavigationBar(QWidget *parent) : XQWidget(parent) { 
    backgroundPixmap_ = new QPixmap(); 
    backgroundPixmap_->load(FilePaths::skinFile("NavigationBarBackground.png"), "png"); 
    // debug check here: 
    if (!backgroundPixmap_->hasAlphaChannel()) { 
     // won't work 
    } 
} 


void NavigationBar::paintEvent(QPaintEvent* event) { 
    QPainter painter(this); 
    painter.fillRect(0, 0, width(), height(), QBrush(*backgroundPixmap)); 
}  

調整高度參數,如果你不想格局垂直重複。

+0

@Qt藍色華夫餅:感謝您的修復!請注意:編輯時請不要留下編輯標記。您可以通過標題爲「編輯X時間前」的鏈接查看每篇文章的編輯歷史記錄(假設文章已被編輯)。 – Mat

0

你確定你的PNG文件實際上是透明的嗎?以下(基本上你在做什麼)正在爲我工​​作。如果在你的機器上失敗了,可能包括你使用的是什麼版本的Qt,以及什麼平臺。

#include <QtGui> 

class TransparentWidget : public QWidget { 
public: 
    TransparentWidget() 
    : QWidget(), 
     background_pixmap_(":/semi_transparent.png") { 
    setFixedSize(400, 100); 
    } 
protected: 
    void paintEvent(QPaintEvent *) { 
    QPainter painter(this); 
    int x = 0; 
    while (x < width()) { 
     painter.drawPixmap(x, 0, background_pixmap_); 
     x += background_pixmap_.width(); 
    } 
    } 
private: 
    QPixmap background_pixmap_; 
}; 

class ParentWidget : public QWidget { 
public: 
    ParentWidget() : QWidget() { 
    QVBoxLayout *layout = new QVBoxLayout; 
    layout->addWidget(new TransparentWidget); 
    layout->addWidget(new QPushButton("Button")); 
    setLayout(layout); 
    setBackgroundRole(QPalette::Dark); 
    setAutoFillBackground(true); 
    } 
}; 

int main(int argc, char **argv) { 
    QApplication app(argc, argv); 
    ParentWidget w; 
    w.show(); 
    return app.exec(); 
}