qt устанавливает виджеты в qgridlayout одинакового размера

#c #qt #qgridlayout

#c #qt #qgridlayout

Вопрос:

У меня есть следующие макеты:

введите описание изображения здесь

когда я растягиваю окно, размер становится таким:

введите описание изображения здесь

Есть ли способ установить виджеты в qgridlayout с одинаковым размером при изменении размера qgridlayout?

Спасибо.

Обновить

Виджет в qgridlayout:

 #ifndef CVIMAGEWIDGET_H
#define CVIMAGEWIDGET_H

#include <QWidget>
#include <QImage>
#include <QPainter>
#include <QGraphicsView>
#include <QGraphicsScene>
#include <QMainWindow>

class CVImageWidget : public QGraphicsView
{
    Q_OBJECT

public:
    explicit CVImageWidget(QMainWindow *GUIWindow, QWidget *parent = 0);
    void drawBoarder(bool flag);
    void showImage(const QImageamp; image);

    void SetCameraID(int camID);
    int GetCameraID();
    void closeDisplay();
    ~CVImageWidget();

private:
    QGraphicsScene *scene_;
    int camera_id_;

public slots:

    void resizeEvent(QResizeEvent *event);

};



#endif // CVIMAGEWIDGET_H
  

CPP-файл

 #include "cvimagewidget.h"
#include <QMouseEvent>
#include <iostream>

CVImageWidget::CVImageWidget(QMainWindow *GUIWindow, QWidget *parent) : QGraphicsView(parent)
{
    scene_ = new QGraphicsScene(parent);
    scene_->setSceneRect(this->sceneRect());
    this->setScene(scene_);
    this->installEventFilter(GUIWindow);
    this->setStyleSheet( "CVImageWidget { border-color: rgb(125,125,116); border-width: 3px; border-style: solid;}");
//    this->setMinimumSize(136, 114);
    camera_id_ = -1;
}


void CVImageWidget::showImage(const QImageamp; image) {
    if(!image.isNull()){
        scene_->clear();
        scene_->addPixmap(QPixmap::fromImage(image));
    }
}

void CVImageWidget::closeDisplay()
{
    scene_->clear();
}

void CVImageWidget::SetCameraID(int camID)
{
    camera_id_ = camID;
}

int CVImageWidget::GetCameraID()
{
    return camera_id_;
}

void CVImageWidget::resizeEvent(QResizeEvent *event)
{
    this->fitInView(this->sceneRect(), Qt::IgnoreAspectRatio);
    QGraphicsView::resizeEvent(event);
}

void CVImageWidget::drawBoarder(bool flag)
{
    if(flag)
    {
        this->setStyleSheet( "CVImageWidget { border-color: rgb(0,255,0); border-width: 3px; border-style: solid;}");
    }else
    {
        this->setStyleSheet( "CVImageWidget { border-color: rgb(125,125,116); border-width: 3px; border-style: solid;}");
    }
}


CVImageWidget::~CVImageWidget()
{
    delete scene_;
}
  

Комментарии:

1. Вы читали это? Там вы можете получить несколько указаний о том, как управлять изменением размера. doc.qt.io/qt-5/layout.html

2. размер макета зависит от используемого виджета, поэтому, если виджет внутри макета сетки имеет одинаковый размер. Они расширяются одинаково. Можете ли вы показать свой код?

3. @sanjay Я обновил код. Можете ли вы помочь

4. @Johnnylin Я обновил ответ

Ответ №1:

При добавлении элементов в layout убедитесь, что вы добавили коэффициент растяжения для всех строк и столбцов.

    int main(int argc, char *argv[])
    {
        QApplication a(argc, argv);

        QWidget widget;
        QGridLayout layout;
        for( int i =0 ; i < 4; i   )
        {
            layout.setRowStretch( i, 1);
            for ( int j = 0; j < 4; j  )
            {
                if( i == 0 )
                {
                    layout.setColumnStretch( j, 1 );
                }
                CVImageWidget * temp = new CVImageWidget( amp;widget );
                layout.addWidget( temp, i, j, 1, 1 );
                if( i ==0 amp;amp; j== 0 )
                {
                    temp->showImage( QImage("/Users/sacp/Desktop/check.png") );
                }
            }
        }
        widget.setLayout( amp;layout );
        widget.show();
        a.exec();
        return 0;
    }
  

Вот как это выглядит после изменения размера
введите описание изображения здесь

Комментарии:

1. В моем классе QMainWindow у меня есть eventFilter, который позволяет пользователю дважды щелкнуть выбранный CVImageWidget. Дважды щелкнутый CVImageWidget расширится до полного размера QGridLayout. Другие виджеты CVImageWidgets будут скрыты? есть ли способ сделать это? Если я установлю растягивание столбца и строки, как я могу добиться эффекта расширения? Спасибо

Ответ №2:

Установите растяжение столбца и строки равным 1 для каждой строки / столбца

Комментарии:

1. Как вы можете видеть на первом скриншоте, все виджеты используют одинаковый размер. Это происходит только при изменении размера. Итак, это виджет внутри, который создает эту проблему.

Ответ №3:

В случае, если вы хотите установить ColumnStretch и RowStretch сразу для всех элементов, это также работает:

 QGridLayout layout;

// Fill layout ...

for(int c=0; c < layout.columnCount(); c  ) layout.setColumnStretch(c,1);
for(int r=0; r < layout.rowCount(); r  )  layout.setRowStretch(r,1);