QT QGraphicsScene 与 QLabel 和 QPixmap

QT QGraphicsScene with QLabel and QPixmap

我有一个 QGraphicsView,因为我有一个 QGraphicsScene,因为我有一个 QLabel,我将一张 .png 图片作为 QPixmap 设置到 QLabel 中。 .png 在 background.qrc 资源文件中设置。 我的 QLabel 大小是 600x400。没有像素图也没关系,QGraphicsScene 的大小也是 600x400。但是当我将像素图设置为 QLabel 并对其进行缩放时,它失败了。 QLabel 的大小相同,像素图在 QLabel 内缩放得很好并且只在 QLabel 内可见,但 QGraphicsScene 采用 QPixmap 的实际大小,即 720x720。所以 QLabel 在 QPixmap 的大小正确时是可见的,但是它周围有一个灰色的地方,因为场景更大。 我该如何解决这个问题并让它发挥作用?我希望 QGraphicScene 保持 QLabel 的大小。

代码如下:

#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QPixmap>
#include <QGraphicsView>
#include <QGraphicsScene>
#include <QLabel>

MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);
    QGraphicsView *myView = new QGraphicsView(this);
    QGraphicsScene *myScene= new QGraphicsScene();
    QLabel *myLabel= new QLabel();
    myLabel->setBaseSize(QSize(600, 400));
    myLabel->resize(myLabel->baseSize());
    myLabel->setScaledContents(true);
    QPixmap pixmapBackground(":/new/cross.png");
    myLabel->setPixmap(pixmapBackground);
    myScene->addWidget(myLabel);
    myView->setScene(myScene);
    setCentralWidget(myView);
}

MainWindow::~MainWindow()
{
    delete ui;
}

根据您的示例代码,您没有设置场景的大小。您可以通过调用 setSceneRect 来完成此操作。正如文档所述,当未设置 rect 时:-

If unset, or if set to a null QRectF, sceneRect() will return the largest bounding rect of all items on the scene since the scene was created (i.e., a rectangle that grows when items are added to or moved in the scene, but never shrinks).

因此在不设置场景矩形的情况下,当标签添加到场景中时,它的大小是变化的,如本例

#include <QApplication>
#include <QGraphicsView>
#include <QGraphicsScene>
#include <QLabel>
#include <QPixmap>

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);

    QGraphicsView *myView = new QGraphicsView;
    QGraphicsScene *myScene= new QGraphicsScene();

    // constrain the QGraphicsScene size
    // without this, the defect as stated in the question is visible
    myScene->setSceneRect(0,0,600,400); 

    QLabel *myLabel= new QLabel;    
    myLabel->setBaseSize(QSize(600, 400));
    myLabel->resize(myLabel->baseSize());
    myLabel->setScaledContents(true);

    QPixmap pixmapBackground(720, 720);
    pixmapBackground.fill(QColor(0, 255, 0)); // green pixmap

    myLabel->setPixmap(pixmapBackground);
    myScene->addWidget(myLabel);
    myView->setScene(myScene);
    myView->show();

    return a.exec();
}

这应该会产生正确的场景大小,如下所示:-

如评论中所述,上面的示例代码在 OS X 上按预期工作,但在 Windows 10.

上执行时似乎仍然存在问题