Qt的QGridLayout按比例设定布局

本文介绍如何在Qt中使用QGridLayout布局管理器,并通过setColumnStretch和setRowStretch函数来调整不同窗体间的比例,实现自定义的界面布局效果。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

-> 今天做了个小测试,如何使用代码控制QGridLayout中的窗体比例呢?

有两个函数可以用上:

QGridLayout::setColumnStretch(列码, 比例值);

QGridLayout::setRowStretch(行码, 比例值);

 

-> 下面是需要实现的比例效果图:

第一行和第二行是1:1,第一列和第二列是1:2

Dumpt.com

 

->具体使用方法见示例代码:

 

 
  1. // main.cpp  
  2.  
  3. #include <QApplication>  
  4. #include <QGridLayout>  
  5. #include <QList>  
  6. #include <QLabel>  
  7. #include <QPalette>  
  8. #include <QString>  
  9.  
  10. void setLayout2p1(QGridLayout * , QWidget * , QList<QLabel*> *);  
  11.  
  12. int main(int argc, char *argv[])  
  13. {  
  14.     QApplication a(argc, argv);  
  15.  
  16. // 初始化变量  
  17.     QPalette myPalette;  
  18.     myPalette.setColor(QPalette::Window, QColor(0, 255, 0));  
  19.     QList<QLabel *> * labelList = new QList<QLabel*>;  
  20.     for(int i = 0; i < 3; ++i){  
  21.         QLabel * temp1 = new QLabel("Label Num: " + QString::number(i + 1, 10));  
  22.         temp1 -> setAutoFillBackground(true);  
  23.         temp1->setPalette(myPalette);  
  24.         labelList->push_back(temp1);  
  25.     }  
  26.  
  27.     QGridLayout * layout2p1 = new QGridLayout();  
  28.     QWidget * testWidget = new QWidget();  
  29.  
  30. // 布局处理  
  31.     setLayout2p1(layout2p1 , testWidget, labelList);  
  32.  
  33.     int result = a.exec();  
  34.  
  35. // 程序指针delete处理  
  36.     // 先删除小的,嵌套在大窗体中的小窗体  
  37.     while(!labelList->isEmpty()){  
  38.         QLabel * temp = labelList -> last();  
  39.         labelList -> removeLast();  
  40.         delete temp;  
  41.     }  
  42.     delete labelList;   // 删除label列表  
  43.     // 然后删除窗口布局  
  44.     delete layout2p1;  
  45.     // 最后删除窗口  
  46.     delete testWidget;  // 运行widget的析构时,它会将关联的layout析构,还有放在这个layout内的窗体析构  
  47.  
  48.     return  result;  
  49. }  
  50.  
  51. void setLayout2p1(QGridLayout * layout2p1, QWidget * testWidget, QList<QLabel*> *labelList)  
  52. {  
  53.     // 放置窗口,设置窗口布局  
  54.     testWidget -> setLayout(layout2p1);  
  55.     layout2p1 -> addWidget(labelList->at(0), 0, 0);  
  56.     layout2p1 -> addWidget(labelList->at(1), 1, 0);  
  57.     layout2p1 -> addWidget(labelList ->at(2), 0, 1, 2, 1);  
  58.  
  59.     // 列比   第0列与第1列之比为 1:2  
  60.     layout2p1 -> setColumnStretch(0, 1);  
  61.     layout2p1 -> setColumnStretch(1, 2);  
  62.  
  63.     // 行比   第0行与第1行之比为1:1  
  64.     layout2p1 -> setRowStretch(0, 1);  
  65.     layout2p1 -> setRowStretch(1, 1);  
  66.  
  67.     testWidget -> show();  
  68.  
  69.     return;  
  70. }  

 

转自:http://neicole.blog.51cto.com/5621716/967329

### QT Designer 中 QGridLayout 的使用教程 #### 1. QGridLayout 基本概念 QGridLayout 是一种用于管理窗口部件(widgets)的网格布局方式。它通过将空间划分为行和列来安排子控件的位置[^1]。这种布局非常适合需要精确控制位置的应用场景。 #### 2. 在 QT Designer 中创建 QGridLayoutQT Designer 中,可以通过以下步骤实现 QGridLayout: - 打开 QT Designer 并新建一个窗体。 - 将所需的控件拖放到空白区域。 - 右键点击任意控件并选择 **"Lay out in a Grid"** 或者直接从顶部菜单栏中选择 **"Form -> Lay Out -> Lay Out in a Grid"** 来应用 QGridLayout 到当前选中的控件集合[^2]。 #### 3. 添加控件到 QGridLayout 一旦设置QGridLayout,可以继续向其中添加新的控件或者调整现有控件的位置。具体操作如下: - 单击某个单元格即可放置一个新的控件。 - 如果希望某些控件跨越多个行列,则可以在属性编辑器中修改 `rowSpan` 和 `columnSpan` 属性[^3]。 #### 4. 调整间距与边距 为了优化视觉效果,可能还需要调节各元素之间的距离以及整个布局相对于父容器边缘的距离。这可通过设置 `spacing` 和 `margin` 参数完成[^3]: ```cpp // 设置水平/垂直方向上的内部间隔 gridLayout->setHorizontalSpacing(value); gridLayout->setVerticalSpacing(value); // 设定外边界宽度 gridLayout->setContentsMargins(left, top, right, bottom); ``` #### 5. 示例代码展示 下面是一个简单的例子演示如何程序化地构建类似的结构: ```python from PyQt5.QtWidgets import QApplication, QWidget, QPushButton, QGridLayout app = QApplication([]) window = QWidget() layout = QGridLayout() button_names = ['Button {}'.format(i+1) for i in range(9)] buttons = [] for idx, name in enumerate(button_names): button = QPushButton(name) buttons.append(button) # Add widgets to grid layout with spans where necessary. positions = [(i,j) for i in range(3) for j in range(3)] for position, button in zip(positions, buttons): r,c = position if c ==0 and (r==1 or r==2): # Example of spanning multiple rows/columns layout.addWidget(button,r,c,2,1)# Span two rows else : layout.addWidget(button,*position ) window.setLayout(layout) window.showMaximized() app.exec_() ``` 此脚本展示了如何在一个三乘三矩阵内布置九个按钮,并让部分按钮占据额外的空间[^1].
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值