4

アルファ透過ウィジェットを作成する必要があります。これは基本的には影付きのナビゲーション バーであり、下のウィジェットは影を通して部分的に見える必要があります。ウィジェットは PNG をロードし、ペイント イベントで描画します。問題は、影がすべて黒く、アルファ透明でないことです。

これは私が現在使用しているコードです:

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();
    }
}

ウィジェットが本当に透明であることを確認するために何を変更する必要があるか知っている人はいますか?

4

2 に答える 2

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));
}    

パターンを垂直方向に繰り返さないようにする場合は、高さパラメーターを調整します。

于 2011-08-06T13:17:32.757 に答える
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();
}
于 2011-08-06T13:14:46.367 に答える