我有一个QGraphicsView,因为我有一个QGraphicsScene,因为我有一个QLabel,我将.png图片作为QPixmap设置到QLabel中。 .png在background.qrc资源文件中设置。 我的QLabel的尺寸是600x400。没有像素图,没关系,QGraphicsScene的大小也是600x400。但是当我将像素图设置为QLabel并对其进行缩放时,它会失败。 QLabel的大小是相同的,pixmap在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;
}
答案 0 :(得分:1)
从您的示例代码中,您不必设置场景的大小。您可以拨打setSceneRect来执行此操作。正如文档所述,当未设置rect时: -
如果未设置,或者设置为零QRectF,则sceneRect()将返回自创建场景以来场景中所有项目的最大边界矩形(即,当项目添加到或移动到场景中时增长的矩形场景,但从不收缩)。
因此,如果不设置场景矩形,当标签添加到场景时,其大小会发生变化,如本例所示
#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上执行时仍然存在问题。