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

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

CaptureWin::CaptureWin()
    {
        QVBoxLayout *vbox = new QVBoxLayout(this);
        vbox->setContentsMargins(QMargins(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 &image, const QString &status)
    {
        m_pLabel->setPixmap(QPixmap::fromImage(image));
        m_pMessage->setText(status);
    }

这工作正常,我的程序从共享内存段(从不同进程生成)捕获视频,视频显示在此窗口中 .

但是,视频图像大小可能会发生变化,因此我尝试将其扩展为动态更改为不同大小的视频 . 我的共享内存 Headers 提供有关图像的信息,如大小 . 所以我可以在尺寸变化时发出信号 .

目前在插槽中我删除了QImage obj,然后使用新的size创建一个新的QImage obj . 就像这样:

void
    Dialog::updatePictureSize()
    {
        delete m_pCaptureImage;
        m_pCaptureImage = new QImage(m_nPictureWidth, m_nPictureHeight, QImage::Format_RGB32);

        m_pCaptureWin->repaint();
        m_pCaptureWin->show();
    }

正如我所说,这样可以正常工作,但CaptureWin不会调整大小,只有QImage . 因此,当我从大视频大小变为小视频大小时,基本窗口不会改变我留下了一个内部有小图像的大白窗口 .

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

那么,让CaptureWin obj调整大小以适应新的QImage大小的正确方法是什么?

谢谢,

-Andres

回答(1)

3 years ago

如果窗口应该始终与图像一样大,并且用户不应该调整它的大小,那么 vbox->setSizeConstraint(QLayout::SetFixedSize) 就能完成这项工作 .