2016-10-19 3 views
3

J'ai un QGraphicsView affichant un QGraphicsScene dans lequel j'aimerais utiliser un QGLWidget comme fenêtre d'affichage. Le Qt documentation m'amène à croire que c'est un simple comme donner à QGraphicsScene un QGLWidget comme une fenêtre d'affichage, mais j'ai un écran noir quand j'essaye.L'utilisation d'un QGLWidget comme fenêtre pour les résultats de QGraphicsView en écran noir

#include <QGraphicsView> 
#include <QGraphicsScene> 
#include <QGraphicsPixmapItem> 
#include <QGLWidget> 

class View : public QGraphicsView 
{ 
    Q_OBJECT 
public: 
    explicit View(QWidget *parent = 0) : 
    QGraphicsView(parent) 
    { 
    QGraphicsPixmapItem *pixmapItem = new QGraphicsPixmapItem(QPixmap(":/images/chart.png")); 

    QGraphicsScene *scene = new QGraphicsScene(); 
    scene->addItem(pixmapItem); 
    setScene(scene); 

    setViewport(new QGLWidget()); 
    } 
}; 

Si je commente la dernière des lignes relatives à la QGLWidget alors mon pixmap affiche bien, mais avec eux, je ne vois qu'un écran noir. J'ai également remarqué que l'utilisation de CPU est significativement plus élevée quand QGLWidget est dedans. J'ai utilisé avec succès QGLWidgets dans le passé (jamais avec un QGraphicsView cependant) ainsi je pense qu'OpenGL fonctionne lui-même correctement. J'ai essayé de changer la couleur claire pour essayer de voir un changement mais il reste noir. J'ai aussi essayé à la fois en utilisant Qt 4 et Qt 5.

Répondre

1

Lors de l'élaboration d'un QPixmap à un QGLWidget, les textures OpenGL sont utilisées. La plate-forme OpenGL aura une taille de texture maximale et votre image dépassera probablement cette limite.

Une solution facile est de diviser la pixmap en petits carreaux, les ajouter à la QGraphicsScene, puis groupe:

QPixmap pixmap(":/images/chart.png"); 
QSize tileSize(512, 512); 
QList<QGraphicsItem *> tiles; 
for(int y = 0; y < pixmap.height(); y += tileSize.height()) 
{ 
    for(int x = 0; x < pixmap.width(); x+= tileSize.width()) 
    { 
     int w = qMin(tileSize.width(), pixmap.width() - x); 
     int h = qMin(tileSize.height(), pixmap.height() - y); 

     QGraphicsItem *tile = scene->addPixmap(pixmap.copy(x, y, w, h)); 
     tile->setPos(x, y); 
     tiles.append(tile); 
     } 
} 
QGraphicsItem *pixmapItem = scene->createItemGroup(tiles); 

Il en résulte pixmapItem pointant vers un groupe de pixmaps qui peut être traitée comme une seule unité. Assurez-vous de choisir une taille de tuile appropriée inférieure à la taille maximale de la texture.

0

OpenGLES Try avec spécification de format de version et de la surface:

QCoreApplication::setAttribute(Qt::AA_UseOpenGLES); 
QSurfaceFormat format; 
format.setVersion(2, 0); 
format.setProfile(QSurfaceFormat::NoProfile); 
format.setSwapInterval(1); 
format.setSwapBehavior(QSurfaceFormat::DoubleBuffer); 
QSurfaceFormat::setDefaultFormat(format);