Qt Designer-窗口不会比带有pixmap的QLabel小

Sam*_*aio 6 c++ qt qt-creator qt-designer

我正在创建一个程序(在Qt Creator 2.8.1,Qt 5.1.1中),该程序基本上显示图像,在这种情况下,是一张纸牌(以及一些按钮,标签和一行编辑)。所有小部件均采用垂直/水平布局,并且窗口布局为网格布局。

我重新实现了主窗口的resize事件,以使图像正确调整大小,并将像素图调整为它的大小-基本上,标签会尽可能垂直扩展(垂直大小策略设置为Expand(1)),然后图像重新缩放。

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

这是我用来管理size(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());       
}
Run Code Online (Sandbox Code Playgroud)

这是Qt Designer中和运行时的安排: 安排

因此,回顾一下:

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

我发现奇怪的是,像素图阻止了窗口垂直调整大小,但是如果水平调整窗口大小,则缩小问题没有问题。

问题是,可能仅仅是:关于如何解决这个问题的任何想法?


(1)也尝试了最小扩展,发生了同样的事情。-还尝试以编程方式调整标签的大小,但随后其他小部件将忽略标签的大小并且不移动,从而导致重叠。

(2)因为我是第一次使用Qt,所以我不知道如何复制可复制,编译和执行的大量代码,而又不会用很多无关紧要的代码填充这个问题。

注意:请随时询问您认为对查找问题的原因和/或解决方案可能有用的更多信息。

mah*_*esh 5

对于仍在寻找解决方案的人们,您需要设置QLabel的最小尺寸:

ui->imageLabel->setMinimumSize(1, 1);
Run Code Online (Sandbox Code Playgroud)

此处指出了解决方案:https : //forum.qt.io/topic/58749/solved-how-to-shrink-qmainwindow-with-a-qlabel-includes-an-image/3


Kri*_*nix 0

首先,要更改标签尺寸,必须为标签选择合适的尺寸策略,例如扩展或最小扩展。然后,您必须通过在每次更改时保持其纵横比来缩放像素图,例如在包含标签的小部件的 resizeEvent 中。

void Widget::resizeEvent(QResizeEvent* event)
{
    QLabel::setPixmap(pix.scaled(this->size(), Qt::KeepAspectRatio, Qt::SmoothTransformation));
}
Run Code Online (Sandbox Code Playgroud)

要保持特定的宽高比,请重新实现 sizeHint() 函数,或者更好的是,使用 setHeightForWidth(true) 并重新实现 heightForWidth() 函数。并且不要忘记,您的标签放置在 CentralWidget 中,但不是直接放置在 MainWindow 中。