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

C++客户端Qt开发——常用控件(多元素控件)

5.多元素控件

Qt中提供的多元素控件有:

QListWidget QListView QTablewidget QTableview QTreewidget QTreeview

xxWidget和xView之间的区别

以QTableWidget和QTableView为例.

  • QTableView是基于MVC设计的控件.QTableView自身不持有数据.使用QTableView的时候需要用户创建一个Model对象(比如QStandardModel),并且把Model和QTableView关联起来.后续修改Mode中的数据就会影响QTableView的显示;修改QTableView的显示也会影响到Model中的数据(双向绑定).
  • QTableWidget则是QTableview的子类,对Model进行了封装.不需要用户手动创建Model对象,直接就可以往QTableWidget中添加数据了

①List Widget 纵向列表

属性

说明

currentRow

当前被选中的是第几行

count

一共有多少行

sortingEnable

是否允许排序

isWrapping

是否允许换行

itemAlignment

元素的对齐方式

selectRectVisible

被选中的元素矩形是否可见

spacing

元素之间的间隔

核心方法

方法

说明

addItem(const QString& label)

addItem(QListWidgetItem* item)

列表中添加元素.

currentItem()

返回QListWidgetltem*表示当前选中的元素

setCurrentItem(QListWidgetItem* item)

设置选中第几行元素

setCurrentRow(int row)

在指定的位置插入元素

insertItem(const QString& label,int row)

insertItem(QListWidgetItem *item,int row)

在指定的位置插入元素

item(int row)

返回QListWidgetltem*表示第row行的元素

takeItem(int row)

删除指定行的元素,返回QListWidgetltem*表示是哪个元素被删除了

核心信号

方法

说明

currentltemChanged(QListWidgetltem* current,QListWidgetltem* old)

选中不同元素时会触发.参数是当前选中的元素和之前选中的元素.

currentRowChanged(int)

选中不同元素时会触发.参数是当前选中元素的行数,

itemclicked(QListWidgetltem* item)

点击某个元素时触发

itemDoubleClicked(QListWidgetltem* item)

双击某个元素时触发

itemEntered(QListWidgetltem* item)

鼠标进入元素时触发

在上述介绍中,涉及到一个关键的类,QListwidgetItem

这个类表示QListWidget中的一个元素

核心方法如下,本质上就是一个"文本+图标"构成的

方法

说明

setFont

设置字体

setIcon

设置图标

setHidden

设置隐藏

setSizeHint

设置尺寸

setSelected

设置是否选中

setText

设置文本

setTextAlignment

设置文本对齐方式

①使用ListWidget

#include "widget.h"
#include "ui_widget.h"
# include<QDebug>
#include <QListWidgetItem>
//  注意加头文件,在头文件中也要加Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget)
{ui->setupUi(this);ui->listWidget->addItem("C++");ui->listWidget->addItem("Java");ui->listWidget->addItem("Python");
}Widget::~Widget()
{delete ui;
}void Widget::on_listWidget_currentItemChanged(QListWidgetItem *current, QListWidgetItem *previous)
{if(current != NULL && previous != NULL){qDebug() << "当前选中:" << current->text()<< "之前选中:" << previous->text();}
}void Widget::on_pushButton_create_clicked()
{//获取到输入框内的内容const QString& text = ui->lineEdit->text();if(text.isEmpty()){return;}ui->listWidget->addItem(text);
}void Widget::on_pushButton_delete_clicked()
{//获取当前被选中的元素int row = ui->listWidget->currentRow();//删除这一行ui->listWidget->takeItem(row);
}

②Table Widget 表格控件

使用QTablewidget表示一个表格控件,一个表格中包含若干行,每一行又包含若干列,表格中的每个单元格,是一个QTableWidgetItem对象

核心方法

方法

说明

item(int row,int column)

根据行数列数获取指定的

QTablewidgetItem*

setltem(int row,int column,QTableWidget*)

根据行数列数设置表格中的元素

currentltem()

返回被选中的元素QTableWidgetltem*

currentRow()

返回被选中元素是第几行

currentColumn()

返回被选中元素是第几列

row(QTableWidgetltem*)

获取指定item是第几行

column(QTableWidgetltem*)

获取指定item是第几列

rowCount()

获取行数

columnCount()

获取列数

insertRow(int row)

在第roW行处插入新行

insertColumn(int column)

在第column列插入新列

removeRow(int row)

删除第row行

removeColumn(int column)

删除第column列

setHorizontalHeaderltem(int

column,QTableWidget*)

设置指定列的表头

setVerticalHeaderltem(int row,

QTableWidget*)

设置指定行的表头

核心信号

信号

说明

cellClicked (int row,int column)

点击单元格时触发

cellDoubleClicked(int row,int

column)

双击单元格时触发

cellEntered(int row,int column)

鼠标进入单元格时触发

currentCellChanged(int row,int

column,int previousRow,int

previousColumn)

选中不同单元格时触发

核心方法

方法

说明

row()

获取当前是第几行

column()

获取当前是第几列

setText(const QString&)

设置文本

setTextAlignment(int)

设置文本对齐

setlcon(const Qlcon&)

设置图标

setSelected(bool)

设置被选中

setSizeHints(const QSize&)

设置尺寸

setFont(const QFont&)

设置字体

①使用QTableWidget

#include "widget.h"
#include "ui_widget.h"Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget)
{ui->setupUi(this);//创建三行ui->tableWidget->insertRow(0);ui->tableWidget->insertRow(1);ui->tableWidget->insertRow(2);//创建三列ui->tableWidget->insertColumn(0);ui->tableWidget->insertColumn(1);ui->tableWidget->insertColumn(2);//设定列名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("20"));ui->tableWidget->setItem(1,0,new QTableWidgetItem("1002"));ui->tableWidget->setItem(1,1,new QTableWidgetItem("李四"));ui->tableWidget->setItem(1,2,new QTableWidgetItem("21"));ui->tableWidget->setItem(2,0,new QTableWidgetItem("1003"));ui->tableWidget->setItem(2,1,new QTableWidgetItem("王五"));ui->tableWidget->setItem(2,2,new QTableWidgetItem("19"));}Widget::~Widget()
{delete ui;
}void Widget::on_pushButton_addrow_clicked()
{int rowcount = ui->tableWidget->rowCount();ui->tableWidget->insertRow(rowcount);
}void Widget::on_pushButton_addcolumn_clicked()
{int colcount = ui->tableWidget->columnCount();ui->tableWidget->insertColumn(colcount);//设置列名const QString& name = ui->lineEdit->text();ui->tableWidget->setHorizontalHeaderItem(colcount,new QTableWidgetItem(name));
}void Widget::on_pushButton_deleterow_clicked()
{int rowcount = ui->tableWidget->currentRow();ui->tableWidget->removeRow(rowcount);
}void Widget::on_pushButton_deletecolumn_clicked()
{int curcol = ui->tableWidget->currentColumn();ui->tableWidget->removeColumn(curcol);
}

默认情况下,单元格中的内容直接就是可编辑的

如果不想让用户编辑,可以设置

ui->tablewidget>setEditTriggers(QAbstractItemView:NoEditTriggers);

③Tree Widget 树形控件

使用QTreewidget表示一个树形控件.里面的每个元素,都是一个QTreeWidgetItem,每个QTreewidgetItem可以包含多个文本和图标,每个文本/图标为一个列

可以给QTreewidget设置顶层节点(顶层节点可以有多个),然后再给顶层节点添加子节点,从而构成树形结构.

核心方法

方法

说明

clear

清空所有子节点

addTopLevelltem(QTreeWidgetltem* item)

新增顶层节点

topLevelltem(int index)

获取指定下标的顶层节点,

topLevelltemCount()

获取顶层节点个数

indexOfTopLevelltem(QTreeWidgetltem* item)

查询指定节点是顶层节点中的下标

takeTopLevelltem(int index)

删除指定的顶层节点.返回QTreeWidgetltem*表示被删除

的元素

currentltem()

获取到当前选中的节点,返回QTreeWidgetltem*

setCurrentltem(QTreeWidgetltem*item)

选中指定节点

setExpanded(bool)

展开/关闭节点

setHeaderLabel(const QString& text)

设置TreeWidget的header名称.

核心信号

信号

说明

currentltemChanged(QTreeWidgetltem*

current,QTreeWidgetltem*old)

切换选中元素时触发

itemClicked(QTreeWidgetltem*item,int col)

点击元素时触发

itemDoubleClicked(QTreeWidgetltem*item,

int col)

双击元素时触发

itemEntered(QTreeWidgetltem*item,int col)

鼠标进入时触发

itemExpanded(QTreeWidgetltem*item)

元素被展开时触发

itemCollapsend(QTreeWidgetltem*item)

元素被折叠时触发

核心属性

属性

说明

text

持有的文本

textAlignment

文本对齐方式

icon

持有的图表

font

文本字体

hidden

是否隐藏

disabled

是否禁用

expand

是否展开

sizeHint

尺寸大小

selected

是否选中

核心方法

方法

说明

addChild(QTreeWidgetltem* child)

新增子节点

childCount()

子节点的个数

child(int index)

获取指定下标的子节点.返回QTreeWidgetltem'

takeChild(int index)

删除对应下标的子节点

removeChild(QTreeWidgetltem*

child)

删除对应的子节点

parent()

获取该元素的父节点

①使用QTreeWidget

#include "widget.h"
#include "ui_widget.h"Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget)
{ui->setupUi(this);ui->treeWidget->setHeaderLabel("动物");QTreeWidgetItem* item1 = new QTreeWidgetItem();item1->setText(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);}Widget::~Widget()
{delete ui;
}void Widget::on_pushButton_addtop_clicked()
{//获取输入框内容const QString& text = ui->lineEdit->text();if(text.isEmpty()){return;}QTreeWidgetItem* item = new QTreeWidgetItem();item->setText(0,text);ui->treeWidget->addTopLevelItem(item);
}void Widget::on_pushButton_addclick_clicked()
{//获取输入框内容const QString& text = ui->lineEdit->text();if(text.isEmpty()){return;}//获取当前选中节点QTreeWidgetItem* currentitem = ui->treeWidget->currentItem();if(currentitem == NULL){return;}//构造新的itemQTreeWidgetItem* newitem = new QTreeWidgetItem();newitem->setText(0,text);//添加item到新节点currentitem->addChild(newitem);//展开父节点currentitem->setExpanded(true);
}void Widget::on_pushButton_delect_clicked()
{QTreeWidgetItem* currentitem = ui->treeWidget->currentItem();if(currentitem == NULL){return;}//获取当前节点的父节点QTreeWidgetItem* parent = currentitem->parent();if(parent==NULL){//顶层节点int index = ui->treeWidget->indexOfTopLevelItem(currentitem);ui->treeWidget->takeTopLevelItem(index);}else{//非顶层节点parent->removeChild(currentitem);}
}
  1. QTreeWidgetItem* currentitem = ui->treeWidget->currentItem(); 这行代码获取当前在树形控件中选中的节点(QTreeWidgetItem),如果没有任何节点被选中,currentItem() 将返回NULL。
  2. if(currentitem == NULL) { return; } 如果currentitem是NULL,表示没有选中任何节点,所以直接结束函数的执行。
  3. QTreeWidgetItem* parent = currentitem->parent(); 获取当前选中节点的父节点。
  4. if(parent == NULL) { ... } 如果父节点是NULL,表示当前选中的节点是一个顶层节点(即它没有父节点)。
  5. int index = ui->treeWidget->indexOfTopLevelItem(currentitem); 获取顶层节点在树形控件中的索引。
  6. ui->treeWidget->takeTopLevelItem(index); 使用索引从树形控件中移除顶层节点,takeTopLevelItem函数会删除节点并返回它,允许开发者重新使用或删除这个节点。
  7. else { ... } 如果当前节点不是顶层节点,执行else块中的代码。
  8. parent->removeChild(currentitem); 调用父节点的removeChild函数来删除当前选中的子节点。

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 数据库管理1
  • 【Linux】centos7安装PHP7.4报错:libzip版本过低
  • 计算机网络入门
  • Ubuntu 磁盘扩容
  • PHP全功能微信投票迷你平台系统小程序源码
  • [web]-图片上传、文件包含-图片上传
  • GNSS技术干货(34):天灵灵 地灵灵 不如C/N0灵
  • Python酷库之旅-第三方库Pandas(026)
  • C++ --> 类和对象(二)
  • Mysql:解决CPU飙升至100%问题的系统诊断与优化策略
  • 深度学习中激活函数的演变与应用:一个综述
  • 解决RuntimeError: Couldn‘t load custom C++ ops. This can happen if your PyTorch
  • [BJDCTF2020]EzPHP1
  • React@16.x(56)Redux@4.x(5)- 实现 createStore
  • 基于IDEA的Lombok插件安装及简单使用
  • angular组件开发
  • C++类的相互关联
  • Fabric架构演变之路
  • iOS帅气加载动画、通知视图、红包助手、引导页、导航栏、朋友圈、小游戏等效果源码...
  • JAVA并发编程--1.基础概念
  • Java多态
  • JS函数式编程 数组部分风格 ES6版
  • Laravel 实践之路: 数据库迁移与数据填充
  • node-sass 安装卡在 node scripts/install.js 解决办法
  • Vue 动态创建 component
  • 创建一个Struts2项目maven 方式
  • 紧急通知:《观止-微软》请在经管柜购买!
  • 每个JavaScript开发人员应阅读的书【1】 - JavaScript: The Good Parts
  • 前端路由实现-history
  • 实战:基于Spring Boot快速开发RESTful风格API接口
  • 思维导图—你不知道的JavaScript中卷
  • 与 ConTeXt MkIV 官方文档的接驳
  • 【云吞铺子】性能抖动剖析(二)
  • python最赚钱的4个方向,你最心动的是哪个?
  • ​14:00面试,14:06就出来了,问的问题有点变态。。。
  • ​LeetCode解法汇总2696. 删除子串后的字符串最小长度
  • ​人工智能之父图灵诞辰纪念日,一起来看最受读者欢迎的AI技术好书
  • ​十个常见的 Python 脚本 (详细介绍 + 代码举例)
  • # 利刃出鞘_Tomcat 核心原理解析(八)-- Tomcat 集群
  • ### Error querying database. Cause: com.mysql.jdbc.exceptions.jdbc4.CommunicationsException
  • #、%和$符号在OGNL表达式中经常出现
  • #1015 : KMP算法
  • #VERDI# 关于如何查看FSM状态机的方法
  • #Z2294. 打印树的直径
  • $.each()与$(selector).each()
  • %check_box% in rails :coditions={:has_many , :through}
  • (提供数据集下载)基于大语言模型LangChain与ChatGLM3-6B本地知识库调优:数据集优化、参数调整、Prompt提示词优化实战
  • (已解决)什么是vue导航守卫
  • (转) Face-Resources
  • (转)Spring4.2.5+Hibernate4.3.11+Struts1.3.8集成方案一
  • .dwp和.webpart的区别
  • .NET 4.0网络开发入门之旅-- 我在“网” 中央(下)
  • .Net Core 笔试1
  • .Net Core 微服务之Consul(三)-KV存储分布式锁
  • .net 程序发生了一个不可捕获的异常