【问题标题】:qt set widgets in qgridlayout with same sizeqt在qgridlayout中设置相同大小的小部件
【发布时间】:2017-03-02 08:49:35
【问题描述】:

我有以下布局:

当我拉伸窗口时,大小变成这样:

当 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 QImage& 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 QImage& 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_;
}

【问题讨论】:

  • 你读过这个吗?您可能会在那里获得一些关于如何控制调整大小的指示。 doc.qt.io/qt-5/layout.html
  • 布局大小取决于使用的小部件,因此如果网格布局内的小部件具有相同的大小。它们同样扩展。可以给你看代码吗?
  • @sanjay 我已经更新了代码。你能帮忙吗
  • @Johnnylin 我已经更新了答案

标签: c++ qt qgridlayout


【解决方案1】:

如果您想同时为所有元素设置 ColumnStretchRowStretch,这也可以:

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

【讨论】:

    【解决方案2】:

    在布局中添加项目时,请确保为所有行和列添加拉伸因子。

       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( &widget );
                    layout.addWidget( temp, i, j, 1, 1 );
                    if( i ==0 && j== 0 )
                    {
                        temp->showImage( QImage("/Users/sacp/Desktop/check.png") );
                    }
                }
            }
            widget.setLayout( &layout );
            widget.show();
            a.exec();
            return 0;
        }
    

    这是调整大小后的样子

    【讨论】:

    • 在我的 QMainWindow 类中,我有一个 eventFilter,它使用户能够双击选定的 CVImageWidget。双击的 CVImageWidget 将扩展为完整的 QGridLayout 大小。其他 CVImageWidgets 会被隐藏吗?有没有办法做到这一点 ?如果我设置列和行拉伸,如何实现扩展效果?谢谢
    【解决方案3】:

    将每行/列的列拉伸和行拉伸设置为 1

    【讨论】:

    • 正如您在第一个屏幕截图中看到的,所有小部件都使用相同的大小。它只发生在调整大小。所以是里面的小部件造成了这个问题。
    猜你喜欢
    • 2020-12-28
    • 2018-04-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-06-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多