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函数来删除当前选中的子节点。
  • 17
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Outlier_9

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值