如何使QWidget透明



我需要创建一个alpha透明小部件,它基本上是一个带阴影的导航栏,下面的小部件需要通过阴影部分可见。小部件加载一个PNG,然后在paint事件上绘制它。问题是阴影是全黑的,不是透明的。

这是我当前使用的代码:

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

有人知道我需要改变什么来确保小部件是真正透明的吗?

你做的太多了:-)

不需要呼叫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));
}    

如果不希望图案垂直重复,可以调整高度参数

你确定你的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();
}

最新更新