Как сделать QWidget альфа-прозрачным - PullRequest
4 голосов
/ 06 августа 2011

Мне нужно создать прозрачный альфа-виджет, это в основном панель навигации с тенью, а виджеты ниже должны быть частично видны сквозь тень. Виджет загружает 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();
    }
}

Кто-нибудь знает, что мне нужно изменить, чтобы убедиться, что виджет действительно прозрачный?

Ответы [ 2 ]

1 голос
/ 06 августа 2011

Вы делаете слишком много работы: -)

В вызове 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 голосов
/ 06 августа 2011

Вы уверены, что ваш файл 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();
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...