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.
上执行时似乎仍然存在问题
我有一个 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.
上执行时似乎仍然存在问题