Фон виджета не прозрачен при использовании QGraphicsView, но прозрачен при использовании QGridLayout

Когда я использовал QGridLayout для отображения своих виджетов, отображался только виджет, а часть изображения, которая была прозрачной, не отображалась. Теперь я переключился на использование QGraphicsScene и QGraphicsView, и теперь мои изображения имеют серый фон везде, где раньше они были прозрачными.

void Piece::paintEvent(QPaintEvent *)
{
    string image = ":/images/" + color + piece + ".png";
    pixmap.load(image.c_str());
    //pixmap.setMask(pixmap.createMaskFromColor(QColor(240, 240, 240)));

    QPainter paint(this);
    paint.drawPixmap(0, 0, pixmap);
} 

Вот как изображение отображается на моем виджете. Когда я использовал код,

layout->addWidget(0,0,1,1);

фон прозрачный. Но когда я использую,

scene->addWidget(piece);

Виджет имеет серый фон. Как я могу сделать его прозрачным? Полный код можно найти здесь, если необходимо (вероятно, не понадобится): https://github.com/gsingh93/Chess

РЕДАКТИРОВАТЬ: я вообще не могу понять эту проблему... Я пытался использовать setAutoFillBackground(false); но это не сработало. Поэтому моей последней надеждой было преобразовать весь мой класс из QWidget в QGrahhicsItem. Это не сработало, и фон изображения по-прежнему серый, а не прозрачный. Если вы не можете понять, что не так с этим кодом, может ли кто-нибудь опубликовать или дать мне ссылку на пример того, как отображать изображение с прозрачным фоном с помощью QGraphicsScene? Вот исходный код, за которым следует код QGraphicsItem, за которым следует моя основная функция.

#include "headers/piece.h"
#include <QPainter>
#include <QMouseEvent>
#include <QBitmap>
#include <QCursor>
using namespace std;

Piece::Piece(string color, string piece, QWidget *parent) :
    QWidget(parent)
{
    this->piece = piece;
    this->color = color;
    this->setMaximumHeight(36);
    this->setMaximumWidth(36);
    x = 0;
    y = 0;
    setMouseTracking(false);
}

void Piece::paintEvent(QPaintEvent *)
{
    string image = ":/images/" + color + piece + ".png";
    pixmap.load(image.c_str());
    //pixmap.setMask(pixmap.createMaskFromColor(QColor(240, 240, 240)));

    QPainter paint(this);
    paint.drawPixmap(0, 0, pixmap);
}

void Piece::setPosition(int file, int rank)
{
    pixmap.load(":/images/whitepawn.png");
    QImage image = pixmap.toImage();
    x = (file-1)*50 + 18;// - image.width()/2;
    y = (rank-1)*50 + 18;// - image.height()/2;
    move(x, y);
}

void Piece::mouseMoveEvent(QMouseEvent *event)
{
    if(event->buttons() == Qt::LeftButton)
    {
    x = event->globalX()-18;
    y = event->globalY()-18;
    move(x,y);
    }
}

.

#include "piece2.h"
#include <QPainter>
#include <QMouseEvent>
#include <QBitmap>
#include <QCursor>
#include <QGraphicsSceneMouseEvent>
using namespace std;

Piece2::Piece2(string color, string piece, QObject *parent) :
    QGraphicsItem()
{
    this->piece = piece;
    this->color = color;
    //this->setMaximumHeight(36);
    //this->setMaximumWidth(36);
    x = 0;
    y = 0;
    //setMouseTracking(false);
}

void Piece2::paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget)
{
    string image = ":/images/" + color + piece + ".png";
    pixmap.load(image.c_str());
    //pixmap.setMask(pixmap.createMaskFromColor(QColor(240, 240, 240)));

    //QPainter paint(this);
    painter->drawPixmap(0, 0, pixmap);
}

void Piece2::setPosition(int file, int rank)
{
    pixmap.load(":/images/whitepawn.png");
    QImage image = pixmap.toImage();
    x = (file-1)*50 + 18;// - image.width()/2;
    y = (rank-1)*50 + 18;// - image.height()/2;
    setPos(x, y);
}

void Piece2::mouseMoveEvent(QGraphicsSceneMouseEvent *event)
{
    if(event->buttons() == Qt::LeftButton)
    {
//  x = event->globalX()-18;
//  y = event->globalY()-18;
    setPos(x,y);
    }
}

.

#include <QtGui>
#include <QGraphicsScene>
#include <QGraphicsView>
#include "headers/board.h"
#include "headers/pawn.h"
#include "headers/knight.h"
#include "headers/bishop.h"
#include "headers/rook.h"
#include "headers/king.h"
#include "headers/queen.h"

int main(int argc, char *argv[])
{
    QApplication app(argc, argv);
    QGraphicsScene *scene = new QGraphicsScene();
    QGraphicsView *view = new QGraphicsView();
    Board board;

    scene->addWidget(&board);
    scene->addWidget(board.pawn2);
    board.pawn2->setPosition(1,1);

    //view->viewport()->setPalette(QColor(Qt::transparent));
    //view->viewport()->setAutoFillBackground(false);
    view->setScene(scene);
    //view->setBackgroundRole(QPalette::NoRole);
    view->show();
    return app.exec();
}

person gsingh2011    schedule 30.08.2011    source источник


Ответы (2)


Вы пытались использовать таблицу стилей, чтобы установить прозрачность фона?

yourWidget->setStyleSheet("background-color: transparent;");
person laurent    schedule 04.09.2011
comment
Вау... Я мог бы поклясться, что пробовал это. Я, наверное, перепутал параметр. В любом случае, спасибо, эта проблема остановила мой прогресс на неделю! Я не знаю, почему это не настройка по умолчанию, похоже, что макеты делают его прозрачным по умолчанию, это тоже должно быть. - person gsingh2011; 04.09.2011

Подтверждаю вашу проблему. Кроме того, решение laurents не может работать в Linux. Но для меня сработало следующее действие:

Прежде чем поместить свой QWidget в QGraphicsScene методом addWidget(), установите ему следующий флаг:

board->setAttribute( Qt::WA_TranslucentBackground );

Подробное объяснение здесь (ru): https://webhamster.ru/mytetrashare/index/mtb0/1625823664d5m6pmpy7s

person Xintrea    schedule 09.07.2021