尧图网站建设 尧图网络
  • 首页
  • 关于我们
  • 服务项目
  • 案例展示
  • 建站流程
  • 资讯中心
  • 联系我们
首页/资讯中心/详情

QT常用控件篇(3)(下)

QT常用控件篇(3)(下)
📅 发布时间:2026/7/6 14:42:43

一、多元素控件

1.介绍和要点

  • 前面两个是列表

  • 中间两个是表格

  • 后面两个是树形

要点:

  • View 仅负责“视图”(V):在MVC(Model-View-Controller) 架构中,View 只承担数据的可视化呈现,不包含数据本身(Model),也不处理用户交互逻辑(Controller)

  • Widget 是更高层的封装:Widget 不仅包含 View 的显示能力,还内嵌了 Model(数据管理) 和Controller(交互逻辑、事件响应、业务流程),形成一个自包含的 UI 组件

1.1 List Widget(列表)

1.属性

2.方法

QListWidgetItem(相当于QListWidget的元素)

3.信号

4.代码

//添加元素 ui->listWidget->addItem("C++"); ui->listWidget->addItem("Java"); ui->listWidget->addItem("Python"); void MainWindow::on_pushButton_clicked() { QString str = ui->lineEdit->text();//获取文本 ui->listWidget->addItem(str); } void MainWindow::on_pushButton_2_clicked() { //获取当前被选中的元素 int row = ui->listWidget->currentRow(); //删除这一行 ui->listWidget->takeItem(row); } //选中不同元素会触发(如果你选的不是第一个元素,那么之前选中默认为第一个元素,如果你选的是第一个元素,就不会有反应) void MainWindow::on_listWidget_currentItemChanged(QListWidgetItem *current, QListWidgetItem *previous) { if(current != NULL && previous != NULL) { qDebug()<<"当前选中:" <<current->text(); qDebug()<<"之前选中:" <<previous->text(); } }

1.2 Table Widget(表格)

1.方法

重点:倒数两个的类型错了,应该是QTableWidgetItem类型

QTable Widget Item

方法:

信号:

2.代码


//创建3行 ui->tableWidget->insertRow(0); ui->tableWidget->insertRow(1); ui->tableWidget->insertRow(2); //创建3列 ui->tableWidget->insertColumn(0); ui->tableWidget->insertColumn(1); ui->tableWidget->insertColumn(2); //给3行去行名 ui->tableWidget->setVerticalHeaderItem(0,new QTableWidgetItem("第一行")); ui->tableWidget->setVerticalHeaderItem(1,new QTableWidgetItem("第二行")); ui->tableWidget->setVerticalHeaderItem(2,new QTableWidgetItem("第三行")); //给3列去列名 ui->tableWidget->setHorizontalHeaderItem(0,new QTableWidgetItem("学号")); ui->tableWidget->setHorizontalHeaderItem(1,new QTableWidgetItem("姓名")); ui->tableWidget->setHorizontalHeaderItem(2,new QTableWidgetItem("年龄")); //设置初始数据 ui->tableWidget->setItem(0,0,new QTableWidgetItem("1001")); ui->tableWidget->setItem(0,1,new QTableWidgetItem("张三")); ui->tableWidget->setItem(0,2,new QTableWidgetItem("18")); ui->tableWidget->setItem(1,0,new QTableWidgetItem("1002")); ui->tableWidget->setItem(1,1,new QTableWidgetItem("李四")); ui->tableWidget->setItem(1,2,new QTableWidgetItem("19")); ui->tableWidget->setItem(2,0,new QTableWidgetItem("1003")); ui->tableWidget->setItem(2,1,new QTableWidgetItem("王五")); ui->tableWidget->setItem(2,2,new QTableWidgetItem("18")); //新增一行 void MainWindow::on_pushButton_clicked() { int row = ui->tableWidget->rowCount();//获取行数 ui->tableWidget->insertRow(row); } //新增一列 void MainWindow::on_pushButton_2_clicked() { int col = ui->tableWidget->columnCount();//获取列数 ui->tableWidget->insertColumn(col); } //删除一行 void MainWindow::on_pushButton_3_clicked() { int row = ui->tableWidget->currentRow();//获取行号 ui->tableWidget->removeRow(row); } //删除一列 void MainWindow::on_pushButton_4_clicked() { int col = ui->tableWidget->currentColumn();//获取行数 ui->tableWidget->removeColumn(col); }

1.3 Tree Widget(树形)

1.介绍和要点

介绍:

“Tree Widget”相关的功能主要用于以树形结构展示层次化数据,用户可展开或折叠节点,并通过选择节点来管理数据。它的


要点:
Tree Widget这个树形结构是没有根节点的,所谓的顶层节点其实就是第一层节点。

2.方法

3.信号

TreeWidgetItem

属性:


方法:


4.代码

//设置根目录的名字(虽然这个树形不存在根目录,但是可以给它取名) ui->treeWidget->setHeaderLabel("动物"); QTreeWidgetItem* item1 = new QTreeWidgetItem(); item1->setText(0,"猫");//0是下表 ui->treeWidget->addTopLevelItem(item1); QTreeWidgetItem* item2 = new QTreeWidgetItem(); item2->setText(0,"狗"); ui->treeWidget->addTopLevelItem(item2); QTreeWidgetItem* item3 = new QTreeWidgetItem(); item3->setText(0,"鸟"); ui->treeWidget->addTopLevelItem(item3); //添加到顶层 void MainWindow::on_pushButton_clicked() { //获取输入框内容 const QString& text = ui->lineEdit->text(); if(text.isEmpty()) { return; } QTreeWidgetItem* item = new QTreeWidgetItem(); item->setText(0,text); ui->treeWidget->addTopLevelItem(item); } //添加到指定节点下面 void MainWindow::on_pushButton_2_clicked() { //获取输入框内容 const QString& text = ui->lineEdit->text(); if(text.isEmpty()) { return; } //获取当前选中的节点 QTreeWidgetItem* item = ui->treeWidget->currentItem(); if(item == NULL) { return; } //构造新的item QTreeWidgetItem* newItem = new QTreeWidgetItem(); newItem->setText(0,text); item->addChild(newItem);//添加到当前选中节点 } void MainWindow::on_pushButton_3_clicked() { //获取当前选中的节点 QTreeWidgetItem* item = ui->treeWidget->currentItem(); if(item == NULL) { return; } //获取当前选中节点的父节点 QTreeWidgetItem* parent = item->parent(); if(parent == NULL) { //顶层节点 int index = ui->treeWidget->indexOfTopLevelItem(item); ui->treeWidget->takeTopLevelItem(index); } else { //非顶层节点 parent->removeChild(item); } }

二、容器类

2.1 Group Box

1.介绍和要点

介绍:
“Group Box”相关的功能主要用于
将一组相关的控件进行逻辑和视觉上的分组,提供带标题的框架容器。

容器类和多元素控件的区别

  • 多元素控件:它包含的内容,是一个个自定义好的Item 对象。

  • 容器类控件:包含的是各种控件,被容器类包含的控件,其父元素就不再是this(窗口),而是容器。

2.属性

重点:如果checked为false(没有选中),那么容器里的控件无法使用

2.2 Tab Widget

1.介绍

介绍:
“Tab Widget”相关的功能主要用于
提供一个多页面的切换容器,每个页面(标签页)可承载不同的界面内容,用户通过点击标签标题在不同页面间切换。


要点:

  • 每一个标签页都是一个QWidget
    ui->Tab1;//就可以访问到这个标签了

2.属性

3.信号

4.方法

addTab

int addTab(QWidget *page, const QString &label) // 功能:向 QTabWidget 中添加一个新标签页,并返回该页的索引 // 参数说明: // • page :要添加为新标签页的 QWidget 指针 // • label :标签页上方显示的文本标题

removeTab

void QTabWidget::removeTab(int index); // 功能:从 QTabWidget 中移除指定索引的标签页 // 参数说明: // • index :要移除的标签页的索引(从 0 开始)

5.代码

void MainWindow::on_pushButton_clicked() { //使用addTab方法创建新的标签页 int count = ui->tabWidget->count();//获取标签页数量 QWidget* w = new QWidget(); ui->tabWidget->addTab(w,QString("Tab") + QString::number(count + 1)); //设置新标签被选中 ui->tabWidget->setCurrentIndex(count); } void MainWindow::on_pushButton_2_clicked() { //使用removeTab删除标签 int index = ui->tabWidget->currentIndex();//获取选中的标签下表 ui->tabWidget->removeTab(index); }

三、布局管理器

3.1 VBoxLayout(垂直布局)

1.属性

2.方法

addWidget

void QLayout::addWidget(QWidget *widget); // 功能:将一个 QWidget 添加到布局(QLayout)中,由布局自动管理其几何位置和大小

setLayout

void QWidget::setLayout(QLayout *layout); // 功能:将一个布局(QLayout)应用到当前 QWidget 上,使布局管理该 widget 的子控件排列

3.代码

//创建三个按钮,使用垂直布局管理起来 QPushButton* button1 = new QPushButton("按钮1"); QPushButton* button2 = new QPushButton("按钮2"); QPushButton* button3 = new QPushButton("按钮3"); //创建布局管理器 QVBoxLayout* layout = new QVBoxLayout(); layout->addWidget(button1); layout->addWidget(button2); layout->addWidget(button3); //把布局管理器添加到窗口中 this->setLayout(layout);

4.要点

  • 如果对象没有绑定父对象,然后被添加到布局管理器中,当该布局被设置给某个窗口或容器控件时,该窗口或容器控件会自动成为这些控件的父对象。

  • 一个 widget只能设置一个顶层布局管理器

3.2 HBoxLayout(水平布局)

1.属性

2.代码


QPushButton* button1 = new QPushButton("按钮1"); QPushButton* button2 = new QPushButton("按钮2"); QPushButton* button3 = new QPushButton("按钮3"); QHBoxLayout* layout = new QHBoxLayout();//创建水平布局 layout->addWidget(button1); layout->addWidget(button2); layout->addWidget(button3); this->setLayout(layout);

3.布局间嵌套

QPushButton* button1 = new QPushButton("按钮1"); QPushButton* button2 = new QPushButton("按钮2"); QPushButton* button3 = new QPushButton("按钮3"); QPushButton* button4 = new QPushButton("按钮4"); //两个水平布局 QHBoxLayout* layout1 = new QHBoxLayout(); QHBoxLayout* layout2 = new QHBoxLayout(); //一个垂直布局 QVBoxLayout* layout3 = new QVBoxLayout(); layout1->addWidget(button1); layout1->addWidget(button2); layout2->addWidget(button3); layout2->addWidget(button4); //垂直布局把水平布局嵌套了 layout3->addLayout(layout1); layout3->addLayout(layout2); this->setLayout(layout3);

重点:布局嵌套并不违背“一个 QWidget 只能有一个顶层布局管理器”的规则,因为嵌套的子布局属于父布局的内容,而非直接设置在 QWidget 上。

3.3 GridLayout(网格布局)

1.属性

重点:在布局管理器中,若要使控件尺寸不均等,需通过设置拉伸比例来控制各控件或子布局所占空间的相对大小。

2.代码

//创建4个按钮,采用2*2的方式进行布局 QPushButton* button1 = new QPushButton("按钮1"); QPushButton* button2 = new QPushButton("按钮2"); QPushButton* button3 = new QPushButton("按钮3"); QPushButton* button4 = new QPushButton("按钮4"); //创建网络布局管理器,将这些控件添加进去 QGridLayout* layout = new QGridLayout(); layout->addWidget(button1,0,0);//(阵营1,的第一个) layout->addWidget(button2,0,1);//(阵营1,的第二个) layout->addWidget(button3,2,0);//(阵营2,的第一个) layout->addWidget(button4,2,1);//(阵营2,的第二个) this->setLayout(layout); //设置水平拉伸系数(1:2) layout->setColumnStretch(0,1); layout->setColumnStretch(1,2);

3.要点

  • x和y并不表示网格中的行号和列号,而是用于标识所属类别或阵营(例如用 1 表示白棋、2 表示黑球等);而“第几行”“第几列”通常由声明顺序决定,而非x、y的数值本身。

  • 设置拉伸系数时,参数分别对应具体的行号和列号(基于声明顺序的索引),而非之前提到的阵营标识值。

  • 在布局管理器中,按钮垂直方向默认不会自动拉伸填充(保持最小高度),因此即使设置了行拉伸系数,按钮本身也不会随行高增加而变高;而水平方向则可以。

//把水平/垂直拉伸都打开 button1->setSizePolicy(QSizePolicy::Expanding,QSizePolicy::Expanding);

3.4 FormLayout(表单布局)

1.介绍

介绍:
“Form Layout”相关的功能主要用于
以表单形式组织“标签-控件”成对出现的布局,常用于设置界面或数据录入界面。

2.方法

addRow

void QFormLayout::addRow(QWidget *label, QWidget *field); //参数一:标签控件用来表示后面是干嘛的(可以为nullptr,代表不要标签) //参数二:交互控件用来输出数据的

3.代码

//创建3个label作为第一列 QLabel* label1 = new QLabel("姓名"); QLabel* label2 = new QLabel("年龄"); QLabel* label3 = new QLabel("电话"); //创建3个lineEdit作为第二列 QLineEdit* edit1 = new QLineEdit(); QLineEdit* edit2 = new QLineEdit(); QLineEdit* edit3 = new QLineEdit(); //创建表单 QFormLayout* layout = new QFormLayout(); this->setLayout(layout); //把上述控件添加到表单布局中 layout->addRow(label1,edit1); layout->addRow(label2,edit2); layout->addRow(label3,edit3); //创建一个提交按钮 QPushButton* button = new QPushButton("提交"); layout->addRow(nullptr,button);

3.5 Spacer(空白)

1.属性

2.代码

QPushButton* button1 = new QPushButton("按钮1"); QPushButton* button2 = new QPushButton("按钮2"); //创建空白 QSpacerItem* spacer = new QSpacerItem(200,300);//传入空白的大小 //创建水平布局 QHBoxLayout* layout = new QHBoxLayout(); layout->addWidget(button1); layout->addSpacerItem(spacer);//插入空白 layout->addWidget(button2); this->setLayout(layout);

相关新闻

  • 基于 Simulink 的龙门机床主轴电机模糊 PID 速度控制及抗干扰仿真实
  • 不可错过的网络攻防演练方案!从零基础到精通,收藏这篇就够了!
  • HoRain云--Claude Code 入门教程

最新新闻

  • 从零开始:用ACE-Step UI免费创作专业级AI音乐的完整指南
  • 3分钟掌握ER-Save-Editor:艾尔登法环存档编辑与转移全攻略
  • 基于像素级感知的街霸AI强化学习系统架构解析
  • MacBook刘海区域如何变身为你的智能音乐控制中心?
  • 如何快速构建AI代理记忆系统:Hindsight完整指南与最佳实践
  • WezTerm终极配置指南:5个核心技巧打造高效终端开发环境

日新闻

  • AI智能体安全防护框架AgentGuard:从原理到实战部署指南
  • KMX63与PIC18F26K40硬件组合及低功耗设计实践
  • 基于YOLO13改进的门体检测模型:C3k2模块与PoolingFormer技术解析

周新闻

  • 基于YOLOv12的番茄成熟度智能检测系统开发
  • 终极RimWorld模组管理指南:用RimSort告别模组冲突烦恼
  • AI Agent框架开发:从理论到实践的完整指南

月新闻

  • 2026年6月公司网站搭建最新热门渠道测评:四大低成本/零代码平台对比+避坑
  • 【Linux】Linux arm 编译QT程序,出现expected “}“报错
  • 【MATLAB例程】四基站二维AOA定位与距离辅助增强对比仿真。基于角度观测和测距修正的固定目标平面定位精度分析

关于尧图

  • 公司简介
  • 团队介绍
  • 企业文化
  • 荣誉资质

服务项目

  • 定制开发
  • 电商建站
  • UI 设计
  • 运维服务

快速链接

  • 案例展示
  • 建站流程
  • 常见问题
  • 资讯中心

联系方式

  • 📍北京市朝阳区互联网产业园 A 座 10 层
  • 📞400-888-8888
  • ✉️contact@rkmt.cn
  • 🕐周一至周日 9:00-21:00

© 2024 北京尧图网络科技有限公司 版权所有 | 京 ICP 备 XXXXXXXX 号