简体   繁体   中英

When qlabel is resized Layout is not updated

I am trying to implement a camera view app in Qt, but I don't know why It doesn't fix correctly layout / buttons. First, before to update the qlabel, I have this:

在此处输入图片说明

But when I click the start button. the GUI changes to this:

在此处输入图片说明

The code to create the window is:

cameraLabel = new QLabel(tr("No camera loaded"));
cameraLabel->setAlignment(Qt::AlignCenter);
cameraLabel->setSizePolicy(QSizePolicy::Ignored, QSizePolicy::Ignored);
cameraLabel->setBackgroundRole(QPalette::Dark);
cameraLabel->setAutoFillBackground(true);
createButtons();
...
..
.

mainLayout = new QHBoxLayout;
mainLayout->addWidget(cameraLabel);
mainLayout->addLayout(buttonsLayout);
setLayout(mainLayout);

void CameraPlayer::createButtons()
{
    QSize iconSize(36, 36);

    playButton = new QToolButton;
    playButton->setIcon(style()->standardIcon(QStyle::SP_MediaPlay));
    playButton->setIconSize(iconSize);
    playButton->setToolTip(tr("Play"));
    connect(playButton, SIGNAL(clicked()), this, SLOT(play()));


    snapshotButton = new QToolButton;
                snapshotButton->setIcon(style()->standardIcon(QStyle::SP_DialogSaveButton));
    snapshotButton->setIconSize(iconSize);
    snapshotButton->setToolTip(tr("Snapshot"));
    connect(snapshotButton, SIGNAL(clicked()), this, SLOT(snapshot()));

    stopButton = new QToolButton;    cameraLabel = new QLabel(tr("No camera loaded"));
    cameraLabel->setAlignment(Qt::AlignCenter);
    cameraLabel->setSizePolicy(QSizePolicy::Ignored, QSizePolicy::Ignored);
    cameraLabel->setBackgroundRole(QPalette::Dark);
    cameraLabel->setAutoFillBackground(true);
    createButtons();

    SParameters& globalParams = GlobalParameters::Instance().params;

    globalParams.IPAddress = "169.251.0.1";
    globalParams.isColor = true;
    globalParams.timer_s =10;


    timerIdCamera = 0;

    mainLayout = new QHBoxLayout;
    mainLayout->addWidget(cameraLabel);
    mainLayout->addLayout(buttonsLayout);
    setLayout(mainLayout);

    stopButton->setIcon(style()->standardIcon(QStyle::SP_MediaStop));
    stopButton->setIconSize(iconSize);
    stopButton->setToolTip(tr("Stop"));
    connect(stopButton, SIGNAL(clicked()), this, SLOT(stop()));

    colorButton = new QPushButton;
    colorButton->setText(tr("WB / Color"));

    connect(colorButton, SIGNAL(clicked()), this, SLOT(changeColor()));


    buttonsLayout = new QVBoxLayout;
    buttonsLayout->addStretch();
    buttonsLayout->addWidget(playButton);
    buttonsLayout->addWidget(snapshotButton);
    buttonsLayout->addWidget(stopButton);
    buttonsLayout->addWidget(colorButton);
    buttonsLayout->addStretch();

}

To udpate the qLabel,It is configured a timer / trigger which is called every x milsecs and update the qlabel object:

void CameraPlayer::timerEvent(QTimerEvent *event){
    try
    {

        if (timerIdCamera!=0)
        {
            if (camera.CameraHasImage())
            {
                QImage *qImage = camera.CameraGrab();
                if (qImage!=NULL &&     SIZE_IMAGE!=QString::number(qImage->byteCount()))
                {
                    cameraLabel->setPixmap(QPixmap::fromImage(*qImage));
                    cameraLabel->setFixedWidth(qImage->width());
                    cameraLabel->show();
                 }
                delete[] qImage->bits();
                delete qImage;
            }

        }
    }
    catch (std::exception &ex)
    {
        QMessageBox qMBox;
        qMBox.setText(QString::fromUtf8(ex.what()));
        qMBox.exec();
    }
}

The problem is here

cameraLabel->setSizePolicy(QSizePolicy::Ignored, QSizePolicy::Ignored);

I was ignoring layout policies from other widgets / layouts. I commented this and It started to work well.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM