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

时间:2014-07-24 17:53:36

标签: c++ qt qt-creator qt-designer

我创建了一个程序(在Qt Creator 2.8.1,Qt 5.1.1中),它基本上显示了一个图像,在这种情况下是一张扑克牌(以及几个按钮,标签和一行编辑) 。所有小部件都是垂直/水平布局,窗口布局是网格布局。

我重新实现了主窗口的 resize事件以使图像正确调整大小并将像素图调整到它的大小 - 基本上,标签垂直扩展可以(垂直大小策略设置为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. 当减小窗口的宽度时,窗口会正常调整大小
    • 如果需要保持图像比例,图像(像素图)会缩小,但标签只会水平缩小
  4. 我觉得奇怪的是pixmap会阻止窗口垂直调整大小,但如果窗口水平调整大小,则缩小没有问题。

    问题是,因为它只能是:关于如何解决这个问题的任何想法?


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

    (2)由于我第一次使用Qt,我不知道如何复制可以复制,编译和执行的代码量,而不是填写此代码问题有很多不重要的代码。

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

2 个答案:

答案 0 :(得分:2)

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

ui->imageLabel->setMinimumSize(1, 1);

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

答案 1 :(得分:0)

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

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

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