我有一个显示QGraphicsScene的QGraphicsView,我想使用QGLWidget作为其视口(viewport)。 Qt documentation使我相信这很简单,只需给QGraphicsScene一个QGLWidget作为视口(viewport),但是尝试时会出现黑屏。

#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有关的行的最后注释,则我的pixmap可以正常显示,但是在它们的情况下,我只会看到黑屏。我还注意到,当插入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指向一组可以视为一个单位的像素图。确保选择小于最大纹理尺寸的合适的瓷砖尺寸。

10-08 06:38