Qt Designer - 窗口无法缩小到小于带有像素图标的QLabel的大小

18

我正在使用Qt Creator 2.8.1和Qt 5.1.1创建一个程序,基本上展示一张图像(在这种情况下是一张纸牌),还附带有几个按钮、标签和一条行编辑器。所有的小部件都在垂直/水平布局中,窗口布局是网格布局。

我重新实现了主窗口的resize event,以便使图像正确地调整大小并调整其大小 - 基本上,标签在垂直方向上尽可能扩展(垂直大小策略设置为Expand(1)),然后对图像进行重新缩放。

当窗口扩展时,一切正常,标签和图像都可以正确地调整大小。然而,我无法将窗口缩小:也就是说,在调整大小时,我无法使窗口的高度比当前标签大小所需的高度更小 - 标签和图像都不会调整大小。如果我水平缩小窗口,那么为了保持比例,图像也会被缩小(最左边的图像),然后我就可以垂直缩小窗口。请注意,当水平调整窗口大小时,仅会缩小图像/像素映射,而不是标签。

以下是我用来管理大小的代码(2):

void MainWindow::resizeEvent(QResizeEvent* event)
{
    QMainWindow::resizeEvent(event);
    //Some code that is not causing the problem - I've checked
    showImage();
}
    
void MainWindow::showImage()
{ 
    int w = ui->imageLabel->width();
    int h = ui->imageLabel->height();

    //Getting image path from file - also not causing the problem
    QPixmap pixmap(":/image/path.png");

    //The image is quite big, so I need to
    // set a scaled pixmap to a w x h window, keeping its aspect ratio
    ui->imageLabel->setPixmap(pixmap.scaled(w,h,Qt::KeepAspectRatio));
    ui->imageLabel->setMask(pixmap.mask());       
}

以下是Qt Designer中的布局以及运行时的效果:

Arrangement

因此,总结一下:

  1. 当增加窗口高度时,标签和图像会按比例增大。
  2. 当减小窗口高度时:
    • 如果图像不必更改,即使标签需要更改,窗口也会正常调整大小。
    • 如果图像需要缩小,则窗口根本不会调整大小。
  3. 当减小窗口宽度时,窗口会正常调整大小。
    • 如果需要保持图像比例,图像(像素图)会缩小,但

我觉得奇怪的是像素图会阻止窗口在垂直方向上调整大小,但在水平方向上调整大小时却没有问题。

问题是,如题所述:有什么解决方法吗?


(1) 也尝试了最小扩展,结果发生了同样的事情。 - 还尝试通过编程方式调整标签大小,但其他部件会忽略标签的大小并且重叠。

(2) 由于我基本上是第一次使用Qt,所以不知道如何复制可以复制、编译和执行的代码量,而不在这个问题中填充大量不重要的代码。

注意:如果您认为有用于找出问题原因或解决方案的更多信息,请随时提问。

2个回答

24

1
有很多关于这个问题的帖子,而这是最好的答案!我不知道为什么其他帖子上没有提到它! - ninhenzo64
2
这个答案应该被接受。让我省了很多的挫败感。 - insaner
需要注意的是,在QtDesigner中,最小大小为0,0是不够的。 - Joma
简单,快速的答案!谢谢。我不知道为什么大小为0,0不起作用.. ^^ - Navis

0
首先,要更改标签大小,您必须为标签选择适当的大小策略,例如扩展或最小扩展。然后,每次更改时都必须通过保持其纵横比来缩放像素图,例如在包含标签的小部件的resizeEvent中。
void Widget::resizeEvent(QResizeEvent* event)
{
    QLabel::setPixmap(pix.scaled(this->size(), Qt::KeepAspectRatio, Qt::SmoothTransformation));
}

为了保持特定的纵横比,请重新实现sizeHint()函数,或者更好的方法是使用setHeightForWidth(true)并重新实现heightForWidth()函数。还要记得,您的标签放置在CentralWidget中,而不是直接放在MainWindow中。

如问题所述,我将标签大小策略设置为扩展和最小扩展。每次 pixmap 更改时,我也尝试缩放它(或在 MainWindow resizeEvent 中尝试),但仅对扩展有效,而对于收缩则无法正常工作。然而,我没有记得/知道 CentralWidget,一旦回家,我会看看是否可以使用它来解决问题。感谢您的建议。 - Sampaio
我来简单解释一下。当你在Designer中使用QMainWindow时,所有的控件都会被放置在QMainWindow的中央窗口部件中,可以在Designer->Form->Show code...中查看。 你只需要编写自己的中央窗口部件,通过继承QWidget类并重新实现它的heightForWidth()和resizeEvent()方法即可。 - Krionix
嗯,那似乎是一个有趣的想法,而且相当简单,但我遇到了一个问题:在新小部件的resizeEvent中是否有任何直接访问标签的方法?我目前正在使用信号/槽连接来实现它,但我得到了相同的结果(垂直收缩被阻止),所以也许有一种更直接的方法? - Sampaio
编辑:我尝试将指向正在运行的主窗口的指针作为参数传递给小部件的构造函数并存储它:parent。但是,在小部件的调整大小事件中访问诸如this->parent->ui->imageLabel之类的内容时,我必须在主窗口的类中将所有这些设置为公共(或至少不是私有的)。因此,也许有更直接的方法?感谢您的时间。 - Sampaio
您当前的问题还需要帮助吗? - Krionix
是的,我尝试了您的建议,并进行了QWidget的子类化。然而,我在从新小部件的函数中访问图像标签方面遇到了问题。使用目前的解决方法来完成这一点,原始问题仍然存在 - 当垂直收缩窗口时,图像仍然不会缩小。 - Sampaio

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接