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;
    }
    //构造新的item
    QTreeWidgetItem* 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函数来删除当前选中的子节点。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/800619.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

[BJDCTF2020]EzPHP1

知识点&#xff1a;1. url编码绕过 2. %0a绕过 3. post优先级绕过 4. php伪协议 5. 数组的强类型比较绕过 6. 取反绕过 进入之后发现了一个很帅气的页面&#x1f60e;~ 看看网页源代码试试~ 是base32编码&#xff0c;尝试一下解码. https://www.qqxiuzi.cn/bianma/base.php 解…

Java二十三种设计模式-适配器模式(6/23)

适配器模式&#xff1a;使不兼容的接口协同工作的桥梁 引言 适配器模式&#xff08;Adapter Pattern&#xff09;是一种结构型设计模式&#xff0c;它允许不兼容的接口之间可以一起工作&#xff0c;通过将一个类的接口转换成客户端期望的另一个接口。 在计算机编程中&#x…

Java | Leetcode Java题解之第237题删除链表中的节点

题目&#xff1a; 题解&#xff1a; class Solution {public void deleteNode(ListNode node) {node.val node.next.val;node.next node.next.next;} }

Windows上LabVIEW编译生成可执行程序

LabVIEW项目浏览器(Project Explorer)中的"Build Specifications"就是用来配置项目发布方法的。在"Build Specifications"右键菜单中选取"New"&#xff0c;可以看到程序有几种不同的发布方法&#xff1a;Application(EXE)、Installer、.Net Inte…

Redis的热key解决

1、Redis热Key会带来哪些问题 1、流量集中&#xff0c;达到物理网卡上限。 当某一热点 Key 的请求在某一主机上超过该主机网卡上限时&#xff0c;由于流量的过度集中&#xff0c;会导致服务器中其它服务无法进行。 2、请求过多&#xff0c;缓存分片服务被打垮。 如果热点过于…

深入理解缓冲区:提升程序性能的关键

深入理解缓冲区&#xff1a;提升程序性能的关键 1、什么是缓冲区&#xff1f;2、缓冲区的作用3、缓冲区在Java中的应用4、如何操作缓冲区5、总结 &#x1f496;The Begin&#x1f496;点点关注&#xff0c;收藏不迷路&#x1f496; 缓冲区&#xff08;Buffer&#xff09;是一种…

mac电脑pdf合并,macpdf合并成一个pdf

在数字化办公和学习的今天&#xff0c;pdf文件因其跨平台兼容性强、格式稳定而成为了最受欢迎的文档格式之一。但随之而来的问题也接踵而至&#xff0c;如何将多个pdf文件合并为一个&#xff1f;这不仅关系到文档的整洁性&#xff0c;更是时间管理的重要环节。今天&#xff0c;…

安全防御:防火墙基本模块

目录 一、接口 1.1 物理接口 1.2 虚拟接口 二、区域 三、模式 3.1 路由模式 3.2 透明模式 3.3 旁路检测模式 3.4 混合模式 四、安全策略 五、防火墙的状态检测和会话表技术 一、接口 1.1 物理接口 三层口 --- 可以配置IP地址的接口 二层口&#xff1a; 普通二层…

CSS在页面中使用的三种方式:行内样式、内嵌式样式表、链接式样式表

CSS样式如何在页面中使用&#xff0c;包含三种方式&#xff1a;行内样式、内嵌式样式表、链接式样式表。 CSS样式的使用系列博文&#xff1a; 《CSS在页面中使用的三种方式&#xff1a;行内样式、内嵌式样式表、链接式样式表》 《CSS选择器&#xff1a;基本选择器、复合选择器、…

[Vulnhub] violator ProFTPD+权限提升

信息收集 IP addressOpening Ports192.168.101.148TCP:21,80,2121 $ nmap -p- 192.168.101.148 --min-rate 1000 -sC -sV PORT STATE SERVICE VERSION 21/tcp open ftp ProFTPD 1.3.5rc3 80/tcp open http Apache httpd 2.4.7 ((Ubuntu)) |_http-title: I Say...…

isaac sim中添加fix joint时,坐标系固定不动问题

例如想为机械臂末端增加一个工具坐标系&#xff0c;此时在flange中添加fixjoint&#xff0c;并依次添加flage和xform 如何xfrom没有添加rigid body属性的话&#xff0c;那么xfrom坐标系就会固定在世界坐标系中&#xff0c;程序启动后机械臂会移动到该坐标系处&#xff0c;并且无…

SpringBoot实现图形验证码

目录 项目创建 前端代码实现 约定前后端交互接口 需求分析 接口定义 Hutool工具 实现服务器端代码 引入依赖 获取验证码 验证码校验 调整前端代码 随着安全性的要求越来越高&#xff0c;目前许多项目中都使用了验证码&#xff0c;验证码也有各种类型&#xff0c;如 …

JavaWeb(四:Ajax与Json)

一、Ajax 1.定义 Ajax&#xff08;Asynchronous JavaScript And XML&#xff09;&#xff1a;异步的 JavaScript 和 XML AJAX 不是新的编程语言&#xff0c;指的是⼀种交互方式&#xff1a;异步加载。 客户端和服务器的数据交互更新在局部页面的技术&#xff0c;不需要刷新…

android13 frameworks里面常用的保存信息或者版本判断的方法

总纲 android13 rom 开发总纲说明 目录 1.前言 2. 数据库 2.1 代码读取用法参考 3.prop 属性配置 3.1 property的key值有哪些特点 4.区别 5. 其他数据存储 6.彩蛋 1.前言 frameworks 不像我们一般开发app那样,很多应用保存的方法都无法使用。这里记录我们系统rom开…

【首发】分享一款三网话费余额查询的API系统

描述 对于计算机专业的小伙伴来说&#xff0c;多熟悉一个系统就多一份就业机会&#xff01; 今天给大家分享一款三网话费余额查询的API系统 亲测可运行&#xff01;&#xff01; 内容 目前主要的内容以php为主&#xff0c;对于学习php有比较大的帮助&#xff01; 但是网络上…

信息系统项目管理师(高项)—学习笔记二

第一章 以下是上一篇&#xff08;信息系统项目管理师&#xff08;高项&#xff09;—学习笔记&#xff09;的续写&#xff0c;因为是之前记录的&#xff0c;这一篇还是细致到每一个小节的内容&#xff0c;有些过于复杂了&#xff0c;后续会简化~ 1.3 现代化创新发展 党的十九…

亚信安全发布2024年第24期《勒索家族和勒索事件监控报告》

本周态势快速感知 本周&#xff0c;勒索软件LockBit涉嫌对美国一家生产乙烯基产品的公司&#xff08;Homeland Vinyl&#xff09;进行攻击。LockBit声称他们已窃取了销售、库存、财务交易数据及其他公司记录&#xff0c;并声明将于2024年7月19日公开这些被盗信息。本周全球共监…

基于双向长短期记忆 BiLSTM 实现股票单变量时间序列预测(PyTorch版)

前言 系列专栏:【深度学习&#xff1a;算法项目实战】✨︎ 涉及医疗健康、财经金融、商业零售、食品饮料、运动健身、交通运输、环境科学、社交媒体以及文本和图像处理等诸多领域&#xff0c;讨论了各种复杂的深度神经网络思想&#xff0c;如卷积神经网络、循环神经网络、生成对…

GitHub连接超时问题 Recv failure: Connection was reset

用手机热点WIF拉取git项目的时候&#xff0c;遇到Recv failure: Connection was reset问题。 解决办法 一、手动开启本地代理 二、在终端&#xff08;cmd&#xff09;输入命令 git config --global http.proxy http://127.0.0.1:7890 git config --global https.proxy https:…

使用Nginx OpenResty与Redis实现高效IP黑白名单管理

1、引言 在当今数字化时代&#xff0c;网络安全已成为企业和个人用户关注的焦点。IP黑白名单作为一种有效的网络安全策略&#xff0c;允许我们精确控制对Web资源的访问权限。通过白名单&#xff0c;我们可以确保只有可信的IP地址能够访问敏感资源&#xff1b;而黑名单则可以阻…