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

标签 c++ linux qt

我有一个派生类(来自 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);
    }

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

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

当前在插槽中,我删除了 QImage obj,然后创建一个具有新大小的新 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。因此,当我从大视频尺寸变为小视频尺寸时,基本窗口不会改变,我只剩下一个大的白色窗口,里面有一个小图像。

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

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

谢谢,

-安德烈斯

最佳答案

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

关于c++ - 如何动态调整 QLabel/QVBoxLayout/QWidget 中使用的 QImage 的大小,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23945434/

相关文章:

linux - SENDTO 发送数据包,但嗅探器看不到它

c - 如何从汇编代码中调用 C 函数 printf 获取整数

c++ - 如何识别应用程序在 Linux 上以深色主题运行?

qt - 从媒体结束时获取信号 Qt.Multimedia 和 QML

c++ - Visual C++ - 运行时检查失败 #3 - 变量未初始化

c++ - 如何在 C++ 中格式化?

c++ - 在不可见的分层窗口中半透明绘制

linux - 重新排序 ELF 文件部分的简单方法

Qt 5 与 SQLite : bindValue() results in "Parameter count mismatch" error

c++ - C++ 17中的折叠表达式