如何动态调整QLabel/QVBoxLayout/QWidget中使用的QImage的大小

How to dynamically resize a QImage used in a QLabel/QVBoxLayout/QWidget

本文关键字:何动态 QImage QWidget QVBoxLayout 动态 调整 QLabel      更新时间:2023-10-16

我有一个派生类(来自QWidget),它使用带有2个项目的QVBoxLayout,这两个项目都是QLabel。顶部的QLabel用于显示视频流,底部的QLabel用于显示状态行。这是来自Qt文档中的一个例子。

<>之前CaptureWin: CaptureWin (){QVBoxLayout *vbox = new QVBoxLayout(this);vbox->setContentsMargins(qmargin (8,8,8,5));m_pLabel = new QLabel();m_pMessage = new QLabel("No frame");vbox -> addWidget (m_pLabel);vbox -> addWidget (m_pMessage);}void CaptureWin::setImage(const QImage ℑ const QString &status){m_pLabel -> setPixmap (QPixmap:: fromImage(图片);m_pMessage -> setText(状态);}之前

这工作得很好,我的程序从共享内存段(从不同的进程生成)捕获视频,视频显示在这个窗口中。

然而,视频图像大小可以改变,所以我试图扩展这一点,以动态地改变不同大小的视频。我的共享内存头提供了关于图像大小的信息。所以我可以在大小变化时发出信号。

当前在槽中,我删除QImage obj,然后用新的大小创建一个新的QImage obj。这样的:

<>之前无效对话框:updatePictureSize (){删除m_pCaptureImage;m_pCaptureImage = new QImage(m_nPictureWidth, m_nPictureHeight, QImage::Format_RGB32);m_pCaptureWin ->重画();m_pCaptureWin -> show ();}之前

正如我所说,这工作得很好,但是CaptureWin不调整大小,只有QImage。因此,当我从大视频大小切换到小视频大小时,基本窗口不会改变,我只剩下一个大的白色窗口,里面有一个小图像。

我越想这个,我认为这是一个非常糟糕的设计,因为QVBoxLayout,它有一个QImage的引用,不知道它已经改变了。

那么,什么是适当的方式来让CaptureWin对象调整大小,以适应新的QImage大小?

谢谢,

andres

如果窗口应该总是和图像一样大,并且用户不应该能够调整它的大小,那么vbox->setSizeConstraint(QLayout::SetFixedSize)将完成这项工作。