使用 QGLWidget 作为 QGraphicsView 的视口导致黑屏
Using a QGLWidget as the viewport for QGraphicsView results in black screen
我有一个显示 QGraphicsScene 的 QGraphicsView,我想使用 QGLWidget 作为视口。 Qt documentation 让我相信这很简单,只要给我的 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 clear 颜色以尝试查看更改,但它仍然是黑色。我也尝试过使用 Qt 4 和 Qt 5。
尝试使用版本和表面格式规范的 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);
将 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
指向一组可以作为一个单元处理的像素图。请务必选择小于最大纹理尺寸的合适图块尺寸。
我有一个显示 QGraphicsScene 的 QGraphicsView,我想使用 QGLWidget 作为视口。 Qt documentation 让我相信这很简单,只要给我的 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 clear 颜色以尝试查看更改,但它仍然是黑色。我也尝试过使用 Qt 4 和 Qt 5。
尝试使用版本和表面格式规范的 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);
将 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
指向一组可以作为一个单元处理的像素图。请务必选择小于最大纹理尺寸的合适图块尺寸。