Qt 如何在布局中收缩QLabel图像?

Qt 如何在布局中收缩QLabel图像?,qt,Qt,我是Qt新手,我正在尝试用一些.png文件制作一个10x24的网格。似乎使用QGridLayout并用QLabel对象填充它是最好的方法,但QLabel似乎不会自动收缩以适应可用空间,因此我最终得出以下结论: 另外,我应该提到我正在使用我创建的QLabel的一个子类,并且这些对象是作为容器对象中数组的一部分创建的: void ObjectSlotArray::initialize() { first = FIRST; isCreated = false; layout = new QGrid

我是Qt新手,我正在尝试用一些.png文件制作一个10x24的网格。似乎使用QGridLayout并用QLabel对象填充它是最好的方法,但QLabel似乎不会自动收缩以适应可用空间,因此我最终得出以下结论:

另外,我应该提到我正在使用我创建的QLabel的一个子类,并且这些对象是作为容器对象中数组的一部分创建的:

void ObjectSlotArray::initialize() {
first = FIRST; 
isCreated = false;
layout = new QGridLayout(this);
for (int c = 0; c < 10; c++) {
    array[c] = new ObjectSlot(c);
    layout->addWidget(array[c], (int)(c / 24), c % 24);
    array[c]->show();} }  //10x24 grid
void objectslotaray::initialize(){
第一=第一;
isCreated=false;
布局=新的QGridLayout(本);
对于(int c=0;c<10;c++){
数组[c]=新对象槽(c);
布局->添加小部件(数组[c],(int)(c/24),c%24);
数组[c]->show();}}//10x24网格

QLabel不会缩放其图像。您可以为标签类(或父容器)添加一个调整大小事件处理程序,一旦已知可用空间,该处理程序将缩放图像,然后将其分配给标签。

使用:

array[c]->setScaledContents(true);
或者在ObjectSlot构造函数中:

setScaledContents(true);

好的,这似乎有效:

void ObjectSlot::paintEvent(QPaintEvent* event) {
    QPixmap* image = new QPixmap("://images/Box.png");
    setPixmap(image->scaled(width(),height(),Qt::KeepAspectRatio));
    QLabel::paintEvent(event);}

一般说明:QGraphicsView内容传统上用于您似乎拥有的视图。或者,使用qtquick2(QML)将是一种更现代或类似Qt5的方法。只要你有一个网格的图像,QWidgets就应该可以工作,但是一旦你开始想要很多移动的项目,一些图形效果等,你的代码就会很快变得凌乱。谢谢你的提醒。我正在制作的应用程序中的大多数项目不会改变位置,所以希望我会没事。这会在每次绘画活动中重新缩放图像。您可能应该移动
setPixmap
来调整事件大小。或者,在“绘制事件”中执行之前,检查图像是否需要重新缩放。