当前位置: 首页 > news >正文

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

一、多元素控件

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.要点

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

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

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

//把水平/垂直拉伸都打开 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);
http://www.jsqmd.com/news/1135288/

相关文章:

  • 项目编号:project50575|Express组团旅游平台:旅游线路、用户报名、订单支付与后台运营全流程技术栈:Express + Node.js + MySQL
  • 基于 Simulink 的龙门机床主轴电机模糊 PID 速度控制及抗干扰仿真实
  • 根据可打包项目进行后续事项推进——HarmonyOS项目上架的AGC操作——九宫数独应用上架示例
  • 抖音动态监控助手:5分钟实现博主实时追踪与直播提醒
  • 【AIGC】 底片 + 形式皮肤
  • 如何快速转换塞尔达传说:旷野之息存档 - Switch与WiiU存档互通终极指南
  • 会议复盘高效方法:自动生成图文核心内容总结
  • 如何用AI技术让复杂的图像分层处理变得简单高效?
  • Go语言的并发编程核心是 **goroutine** 和 **channel**,它们共同构成了Go轻量、简洁、安全的并发模型
  • 中小游戏厂商如何应对DDoS与勒索攻击:从零构建实战安全体系
  • 2026河南省高考招生之友+录取统计(物理组+历史组)
  • 避开 AI 内卷红海,10 个细分赛道落地步骤、获客定价全拆解
  • 英雄联盟Akari助手:提升游戏效率的终极免费工具完整指南
  • ETT-small 数据集实战:基于 PyTorch 的 5 步时间序列预测数据加载与预处理
  • 铠侠THGBMTG5D1LBAIL:4GB eMMC 5.0嵌入式闪存技术规格
  • 从CVE-2017-20063看.htaccess配置篡改如何绕过文件上传防护
  • 14| 怎么老是出现“地址已经被使用”?
  • 从零到机器人专家:20个实战例程带你掌握STM32嵌入式开发
  • 小程序商城搭建工具对比:餐宝盈/BBWEYY/比文云/Yola/Odoo Website实测,含零代码SAAS、AI编程、源码定制交付
  • Web 渗透测试实战:一文掌握身份验证与会话管理全流程
  • TVA对具身智能领域“莫拉维克悖论“的挑战(17)
  • 别再折腾本地部署了:RunningHub,可能是普通创作者更适合上手的云端 ComfyUI 平台
  • Ubuntu 22.04下CVE-2023-38545堆溢出漏洞复现与深度分析
  • AprilTag 3 家族对比:TAG25H9 vs TAG36H11 在6个关键维度的选择指南
  • KMR221与TM4C129XNCZAD实现精密电压管理方案
  • 大模型商业化淘汰赛:巨头与创业公司盈利逻辑、全行业趋势深度解析
  • 独立站搭建工具测评:BBWEYY/比文云/Supabase/Notion AI(2026年7月更新)含零代码SAAS、AI编程、源码定制交付
  • 编译原理:文法和语言
  • TVA对具身智能领域“莫拉维克悖论“的挑战(18)
  • 从 if else 到 switch case 再到抽象