qt元素布局
一、QGridLayout(表格布局)
(一)使用QGridLayout控件的思路
在新建QGridLayout对象之前,应该先将在将使用到的控件进行初始化。
1.初始化布局
新建QGridLayout之后,在桌面上就会出现一个网格状的布局,这个布局是看不见的,如下表格一样,那么如何确定这样的表格有几行几列呢?可以对其进行初始化
第0行第0列 | 第0行第1列 |
第1行第0列 | 第1行第2列 |
第2行第0列 | 第2行第2列 |
- setRowStretch(行数,行宽度); //第一个参数是行数,其最大值表示这个布局有几行;第二个参数是该行的长度比例
- setColumnStretch(列数,列宽度); 第一个参数是行数,其最大值表示这个布局有几列;第二个参数是该列的长度比例
2.添加控件到布局中
addWidget有两种不同的重载形式。
- addWidget(控件名,行数,列数);
- addWidget(控件名,行数,列数,控件长度占几行,控件长度占几列);
(二)设置常见属性
//设置最小列宽 void setColumnMinimumWidth(int column, int minSize)
//设置最小行高 void setRowMinimumHeight(int row, int minSize)
//设置每一列的列宽比例 void setColumnStretch(int column, int stretch)
//设置每一行的行高比例 void setRowStretch(int row, int stretch)
//设置水平方向各控件的间隔 void setHorizontalSpacing(int spacing)
//同时设置设置水平方向和垂直方向上各控件的间隔 void setSpacing(int spacing)
//设置垂直方向各控件的间隔 void setVerticalSpacing(int spacing)
设置尺寸控制模式,通过如下函数设置:
void setSizeConstraint(SizeConstraint)
其参数有如下可选值:
Constant | Value | Description |
QLayout::SetDefaultConstraint | 0 | 主小部件的最小尺寸被设置为minimumSize(),除非小部件已经有了最小尺寸。 |
QLayout::SetFixedSize | 3 | 主部件的尺寸被设置为sizeHint();它根本无法调整尺寸。 |
QLayout::SetMinimumSize | 2 | 主部件的最小尺寸设置为minimumSize();不能再小了。 |
QLayout::SetMaximumSize | 4 | 主部件的最大尺寸设置为maximumSize();不能再大了。 |
QLayout::SetMinAndMaxSize | 5 | 主小部件的最小尺寸设置为minimumSize(),最大尺寸设置为maximumSize()。 |
QLayout::SetNoConstraint | 1 | 小部件不受约束。 |
设置表格坐标原点,通过如下函数设置:
void setOriginCorner(Qt::Corner corner)
其参数有如下可选值:
Constant | Value | Description |
Qt::TopLeftCorner | 0x00000 | 以矩形的左上角为原点。 |
Qt::TopRightCorner | 0x00001 | 以矩形的右上角为原点。 |
Qt::BottomLeftCorner | 0x00002 | 以矩形的左下角为原点。 |
Qt::BottomRightCorner | 0x00003 | 以矩形的右下角为原点。 |
(三)例子
// 初始设定 setAttribute(Qt::WA_TransparentForMouseEvents, true); setMouseTracking(true); setFixedSize(CELL_SIZE * 3, CELL_SIZE * 2); QPixmap t_pixmap = QPixmap(DLG_PATH).scaled(CELL_SIZE * 3, CELL_SIZE * 3); setPixmap(t_pixmap); // 各个属性 m_nameLabel.setText(m_name); m_hpLabel1.setText("血量"); m_hpLabel2.setText(QString::number(m_fullhp) + "/" + QString::number(m_fullhp)); m_armorLabel1.setText("护甲"); m_armorLabel2.setText(QString::number(m_armor)); // 将属性加入layout m_layout.addWidget(&m_nameLabel, 0, 0); m_layout.addWidget(&m_hpLabel1, 1, 0); m_layout.addWidget(&m_hpLabel2, 1, 1); m_layout.addWidget(&m_armorLabel1, 2, 0); m_layout.addWidget(&m_armorLabel2, 2, 1); m_layout.setVerticalSpacing(0); setLayout(&m_layout);
move(x, (localCelly - 1) * CELL_SIZE);
显示结果:
二、QVBoxLayout
QVBoxLayout类垂直排列小部件。此类用于构造垂直框布局对象。
例子:
// 为三个操作按键设置layout m_layout = new QVBoxLayout; m_moveButton = new QPushButton; m_attrackButton = new QPushButton; m_skipButton = new QPushButton; setFixedSize(90, 90); // 设置文字 m_moveButton->setText("移动"); m_attrackButton->setText("攻击"); m_skipButton->setText("跳过"); m_layout->addWidget(m_moveButton); m_layout->addWidget(m_attrackButton); m_layout->addWidget(m_skipButton); m_layout->setSpacing(0); setLayout(m_layout);
显示结果:
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 记一次.NET内存居高不下排查解决与启示
· DeepSeek 开源周回顾「GitHub 热点速览」
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了