使用QGLWidget作为QGraphicsView的视口会导致黑屏



我有一个QGraphicsView显示一个QGraphicsScene,我想使用一个QGLWidget作为视口。Qt文档让我相信,这是一个简单的给我的QGraphicsScene一个QGLWidget作为视口,但我得到一个黑屏,当我尝试。

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

如果我注释与QGLWidget相关的最后两行,那么我的像素图显示良好,但是我只看到一个黑屏。我还注意到,当QGLWidget启用时,CPU使用率明显更高。我过去曾成功地使用过QGLWidgets(从未使用过QGraphicsView),所以我认为OpenGL本身工作正常。我试过改变gl清晰的颜色,试图看到一个变化,但它仍然是黑色的。我也尝试过使用Qt 4和Qt 5。

当绘制QPixmap到QGLWidget时,使用OpenGL纹理。OpenGL平台有一个最大的纹理大小,很可能你的图像超过了这个限制。

一个简单的修复方法是将像素图细分为更小的图块,将它们添加到QGraphicsScene中,然后将它们分组:

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

这导致pixmapItem指向一组可以被视为单个单元的像素图。请务必选择合适的贴图尺寸,小于最大纹理尺寸。

尝试使用版本和表面格式规范的OpenGLES:

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

相关内容

  • 没有找到相关文章

最新更新