【问题标题】:How to make a QWidget alpha-transparent如何使 QWidget Alpha 透明
【发布时间】:2011-08-06 12:30:38
【问题描述】:

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

这是我目前使用的代码:

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

有人知道我需要更改什么以确保小部件真正透明吗?

【问题讨论】:

    标签: qt background shadow qwidget alpha-transparency


    【解决方案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));
    }    
    

    如果您不希望图案垂直重复,请调整高度参数。

    【讨论】:

    • @Qt Blue Waffle:感谢您的修复!请注意:进行编辑时请不要留下编辑标记。您可以通过“编辑 X 时间前”链接查看每个帖子的编辑历史记录(假设帖子已被编辑)。
    【解决方案2】:

    您确定您的 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-11-27
      • 2011-05-24
      • 1970-01-01
      • 2011-04-28
      • 1970-01-01
      • 1970-01-01
      • 2023-03-26
      • 2023-03-24
      • 2021-12-06
      相关资源
      最近更新 更多