2011-08-06 11 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 Blue Waffle:修正していただきありがとうございます!ちょっとしたメモ:編集時に編集マーカーを残さないでください。それぞれの投稿の編集履歴は、「編集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(); 
} 
関連する問題