2011-08-30 2 views
3

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

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

EDIT: Я не могу понять эту проблему вообще ... Я попытался использовать 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(); 
} 

ответ

7

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

yourWidget->setStyleSheet("background-color: transparent;"); 
+2

Вау ... Я мог бы поклясться, что попробовал это. Я, наверное, испортил параметр. В любом случае, спасибо, эта проблема остановила мой прогресс в течение недели! Я не знаю, почему это не параметр по умолчанию, но похоже, что макеты делают его прозрачным по умолчанию, это тоже должно быть. – gsingh2011

Смежные вопросы