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

news2024/9/21 11:10:03

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函数来删除当前选中的子节点。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【密码学】密码学数学基础:剩余系

不得不啃的密码学数学基础之剩余系是个啥&#xff1f;数学里面有好多的定义都有前置的数学概念&#xff0c;要想弄懂剩余系还得先说说“同余”。 一、同余 那么“同余”有是个什么呢&#xff1f;在谈论“同余”之前&#xff0c;我们先圈定个讨论的范围。接下来讨论的都是整数集…

PyTorch Autograd内部实现

优化&#xff1a;如果is_leafFalse&#xff0c;则说明不需要该Tensor的grad&#xff0c;所以&#xff0c;grad_fn直接将output梯度传递给下一个grad_fn了&#xff0c;绕开对该Tensor的grad的更新&#xff1b;

C语言 | Leetcode C语言题解之第235题二叉搜索树的最近公共祖先

题目&#xff1a; 题解&#xff1a; struct TreeNode* lowestCommonAncestor(struct TreeNode* root, struct TreeNode* p, struct TreeNode* q) {struct TreeNode* ancestor root;while (true) {if (p->val < ancestor->val && q->val < ancestor-&g…

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

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

干货丨ChatGPT高阶玩法(上)

正文共1321字 预计阅读时间4分钟 是的,你没有看错,上面这段这么像人写的内容其实是由ChatGPT这个机器人AI生成的(我只稍加修改了几个字),发送下面第一个提示词口令,然后加以进一步引导并不断改进就可以得到你想要的结果,具体操作见文中图片。 使用说明 以下【】里的内…

Unable to obtain driver using Selenium Manager: Selenium Manager failed解决方案

大家好,我是爱编程的喵喵。双985硕士毕业,现担任全栈工程师一职,热衷于将数据思维应用到工作与生活中。从事机器学习以及相关的前后端开发工作。曾在阿里云、科大讯飞、CCF等比赛获得多次Top名次。现为CSDN博客专家、人工智能领域优质创作者。喜欢通过博客创作的方式对所学的…

《Windows API 每日一练》10.1 模态对话框

对话框分“模态”和“非模态”两种&#xff0c;其中模态对话框最为常见。当程序显示一个模态对话框时&#xff0c;用户不能在对话框和该程序的其他窗口之间进行切换。用户必须先明确地终止该对话框。这通常由单击OK或Cancel按钮来实现。但是当对话框正在显示时&#xff0c;用户…

[Linux]基本指令(二)

一些剩下的指令部分 mv指令&#xff08;重要&#xff09; mv 命令是 move 的缩写&#xff0c;可以用来移动文件或者将文件改名&#xff08; move (rename) files &#xff09;&#xff0c;是 Linux 系统下常用的命令&#xff0c; 经常用来备份文件或者目录。 语法 : mv [ 选项…

京东.Vision首登苹果Vision Pro 背后的技术探索

去年6月&#xff0c;苹果正式发布首款头显设备Apple Vision Pro&#xff0c;今年6月28号&#xff0c;Apple Vision Pro正式在中国发售。京东.Vision作为首批原生应用登陆Vision Pro平台&#xff0c;首期以家电家居与潮流数码产品作为切入口&#xff0c;未来将逐步拓展至全品类&…

基于 jenkins 部署接口自动化测试项目!

引言 在现代软件开发过程中&#xff0c;自动化测试是保证代码质量的关键环节。通过自动化测试&#xff0c;可以快速发现和修复代码中的问题&#xff0c;从而提高开发效率和产品质量。而 Jenkins 作为一款开源的持续集成工具&#xff0c;可以帮助我们实现自动化测试的自动化部署…

python编程:从入门到实践(第三版) 笔记

文章目录 资源网站:https://www.ituring.com.cn/book/3038配置VSCode推荐资源网站推荐资源网址 资源网站:https://www.ituring.com.cn/book/3038 配置VSCode 推荐资源网站 推荐资源网址 英文版主页&#xff1a; https://ehmatthes.github.io/pcc_3e 中文版主页&#xff1a; h…

【人工智能】Transformers之Pipeline(二):自动语音识别(automatic-speech-recognition)

​​​​​​​ 目录 一、引言 二、自动语音识别&#xff08;automatic-speech-recognition&#xff09; 2.1 概述 2.2 技术原理 2.2.1 whisper模型 2.2.2 Wav2vec 2.0模型 2.3 pipeline参数 2.3.1 pipeline对象实例化参数​​​​​​​ 2.3.2 pipeline对象使用参数…

MFC程序创建word,创建表格,写入数据

文章目录 1、MFC程序功能&#xff1a;2、MFC程序实现2.1 创建项目2.2 添加word操作类2.3 添加word资源2.4 编写代码&#xff0c;实现将数据写入到word2.5 运行程序、验证功能3、工程代码下载 1、MFC程序功能&#xff1a; 创建word文档&#xff1b;向文档中写入字符串&#xff…

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

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

爬虫兽-抖音评论提取截流工具|评论爬虫|视频评论提取-拓客

抖音评论提取软件使用说明 抖音视频评论提取到的内容&#xff1a;1&#xff1a;视频名称 2&#xff1a;视频作者 3&#xff1a;作者地址 4&#xff1a;视频地址 5&#xff1a;评论人昵称。6&#xff1a;评论人主页地址。7&#xff1a;评论内容 8&#xff1a;评论日期 一&…

品牌形象的智能塑造:Kompas.ai如何构建品牌视觉识别

品牌形象是企业在消费者心中构建的独特印象&#xff0c;它对于品牌识别和记忆度至关重要。一个一致且具有辨识度的品牌形象能够帮助企业在激烈的市场竞争中脱颖而出。Kompas.ai&#xff0c;作为一款智能设计工具&#xff0c;正帮助品牌塑造和维护其独特的视觉识别系统。 一致的…

绿色积分引领消费增值浪潮“

尊敬的顾客们&#xff0c;大家好&#xff01;在此&#xff0c;我满怀热情地与您分享一个革命性的消费新观念——消费增值&#xff0c;旨在让您的每一笔消费都焕发出前所未有的价值&#xff01; 长久以来&#xff0c;我们的消费习惯似乎总是单向的&#xff1a;花钱&#xff0c;…

量化交易研究报告#13

核心公式 通过对 HS300 相对强弱指标值变化规律的梳理&#xff0c;我们制定如下的交易法则&#xff1a; &#xff08;1&#xff09;计算指标的 20 日均值变化&#xff0c;以及 20 日标准差&#xff1b; &#xff08;2&#xff09;20日均值1倍标准差作为上阈值&#xff0c;20…

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

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

Web开发:<br>标签的作用

br作用 介绍基本用法常见用途注意事项使用CSS替代 介绍 在Web开发中&#xff0c;<br> 标签是一个用于插入换行符的HTML标签。它是“break”的缩写&#xff0c;常用于需要在文本中强制换行的地方。<br> 标签是一个空标签&#xff0c;这意味着它没有结束标签。 基本…