1
votes

I have a derived class (from QWidget) that uses a QVBoxLayout with 2 items, both of which are a QLabel. The top QLabel is used to display a video stream and the bottom QLabel is use for a status line. This is from one of the examples in the Qt documentation.


     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);
    }

This is working just fine, my program captures the video from a shared memory segment (generated from a different process) and the video is displayed in this window.

However, the video image size can change, so I am trying to extend this to change to different size videos dynamically. My shared memory header gives the information about the image like sizes. So I can emit signals when the size changes.

Currently in the slot I delete the QImage obj, then create a new QImage obj with the new size.Like this:

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

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

As I said this works fine, however the CaptureWin does not resize, only the QImage. So when I go from a large video size to a small video size the basic window does not change I am left with a large white window with a small image inside.

The more I think about this, I think this is very poor design because the QVBoxLayout, which has a reference to the QImage, does not know it has changed.

So, what is the proper way to have the CaptureWin obj resize to accommodate the new QImage size?

Thanks,

-Andres

1

1 Answers

0
votes

If the window should always be as big as the image, and the user shouldn't be able to resize it, then vbox->setSizeConstraint(QLayout::SetFixedSize) would do the job.