【Qt】控件概述(5)—— 多元素控件

1. 多元素控件的种类

  • QListWidget
  • QListView
  • QTableWidget
  • QTableView
  • QTreeWidget
  • QTreeView

其中总的俩算其实只有三种,上面的两两配对是属于同一类的。

xxWidget和xxView之间的区别以QTableWidget和QTableView为例.

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

2. QListWidget——显示纵向列表

核心属性

属性说明
currentRow当前被选中的是第几行
count⼀共有多少行
sortingEnabled是否允许排序
isWrapping是否允许换行
itemAlignment元素的对齐方式
selectRectVisible被选中的元素矩形是否可见
spacing元素之间的间隔

核心方法

方法说明
addItem(const QString& label),addItem(QListWidgetItem * item)列表中添加元素.
currentItem()返回QListWidgetItem * 表⽰当前选中的元素
setCurrentItem(QListWidgetItem* item)设置选中哪个元素
setCurrentRow(int row)设置选中第几行的元素
insertItem(const QString& label, int row) ,insertItem(QListWidgetItem * item, int row)在指定的位置插⼊元素
item(int row)返回 QListWidgetItem * 表示第 row 行的元素
takeItem(int row)删除指定行的元素,返回QListWidgetItem*表示是哪个元素被删除了

核心信号

方法说明
currentItemChanged(QListWidgetItem* current, QListWidgetItem* old)选中不同元素时会触发. 参数是当前选中的元素和之前选中的元素.
currentRowChanged(int)选中不同元素时会触发. 参数是当前选中元素的行数.
itemClicked(QListWidgetItem* item)点击某个元素时触发
itemDoubleClicked(QListWidgetItem*item)双击某个元素时触发
itemEntered(QListWidgetItem* item)鼠标进⼊元素时触发

上面还涉及到了一个关键的类,QListWidgetItem,这个类表示QListWidget中的一个元素,我们可以通过这个类对其中的文本进行样式设计。

方法说明
setFont设置字体
setIcon设置图标
setHidden设置隐藏
setSizeHint设置尺寸
setSelected设置是否选中
setText设置文本
setTextAlignment设置文本对对齐方式.

代码样例:通过两个按钮实现添加和删除。

创建一个QListWidget,一个QLineEdit和两个QPushButton,这两个按钮分别对应着添加和删除,添加按钮可以将linEdit中的文本添加到listWidget中,二删除则可以将我们鼠标选中的进行删除。

void Widget::on_pushButton_clicked()
{
    // 获取lineEdit中的数据
    const QString& content = ui->lineEdit->text();
    // 添加到lineWidget中
    ui->listWidget->addItem(content);
}

void Widget::on_pushButton_2_clicked()
{
    // 获取鼠标选中的行
    int line = ui->listWidget->currentRow();
    // 删除对应的行的数据
    ui->listWidget->takeItem(line);
}

在这里插入图片描述

3. QTableWidget

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

核心方法

方法说明
item(int row, int column)根据行数列数获取指定的QTableWidgetItem*
setItem(int row,int column,QTableWidget*)根据行数列数设置表格中的元素
currentItem()返回被选中的元素QTableWidgetItem*
currentRow()返回被选中元素是第几行
currentColumn()返回被选中元素是第几列
row(QTableWidgetItem*)获取指定item是第几行
column(QTableWidgetItem*)获取指定item是第几列
rowCount()获取行数
columnCount()获取列数
insertRow(int row)在第 row 行处插入新行
insertColumn(int column)在第 column列插⼊新列
removeRow(int row)删除第 row行
removeColumn(int column)删除第column列
setHorizontalHeaderItem(int column, QTableWidget*)设置指定列的表头
setVerticalHeaderItem(int row, QTableWidget*)设置指定行的表头
setEditTriggers是否可以编辑

QTableWidgetItem 核心信号

信号说明
cellClicked(int row, int column)点击单元格时触发
cellDoubleClicked(int row,int column)双击单元格时触发
cellEntered(int row,int column)鼠标进⼊单元格时触发
currentCellChanged(int row,int column,int previousRow,int previousColumn)选中不同单元格时触发

QTableWidgetItem 核心方法

方法说明
row()获取当前是第几行column() 获取当前是第几列
setText(const QString&)设置文本
setTextAlignment(int)设置文本对齐
setIcon(constQIcon&)设置图标
setSelected(bool)设置被选中
setSizeHints(const QSize&)设置尺寸
setFont(const QFont&)设置字体

代码样例:通过按钮的方式添加/删除行/列

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("张三"));
    ui->tableWidget->setItem(0, 1, new QTableWidgetItem("18"));
    ui->tableWidget->setItem(0, 2, new QTableWidgetItem("男"));

    ui->tableWidget->setItem(1, 0, new QTableWidgetItem("李四"));
    ui->tableWidget->setItem(1, 1, new QTableWidgetItem("19"));
    ui->tableWidget->setItem(1, 2, new QTableWidgetItem("女"));

    ui->tableWidget->setItem(2, 0, new QTableWidgetItem("王五"));
    ui->tableWidget->setItem(2, 1, new QTableWidgetItem("20"));
    ui->tableWidget->setItem(2, 2, new QTableWidgetItem("男"));
}

void Widget::on_pushButton_clicked()
{
    int count = ui->tableWidget->rowCount();
    ui->tableWidget->insertRow(count);
}

void Widget::on_pushButton_2_clicked()
{
    int row = ui->tableWidget->currentRow();
    ui->tableWidget->removeRow(row);
}

void Widget::on_pushButton_3_clicked()
{
    int count = ui->tableWidget->columnCount();
    ui->tableWidget->insertColumn(count);
    const QString& columnName = ui->lineEdit->text();
    ui->tableWidget->setHorizontalHeaderItem(count, new QTableWidgetItem(columnName));
}

void Widget::on_pushButton_4_clicked()
{
    int column = ui->tableWidget->currentColumn();
    ui->tableWidget->removeColumn(column);
}

void Widget::on_pushButton_5_clicked()
{
    int row = ui->tableWidget->currentRow();
    int column = ui->tableWidget->currentColumn();
    const QString& contents = ui->lineEdit_2->text();
    ui->tableWidget->setItem(row, column, new QTableWidgetItem(contents));
}

在这里插入图片描述

默认情况下,单元格中的内容直接就是可编辑的.如果不想让用户编辑,可以设置
ui->tableWidget->setEditTriggers(QAbstractItemView::NoEditTriggers);

4. QTreeWidget

使用QTreeWidget 表示⼀个树形控件.里面的每个元素,都是⼀个QTreeWidgetItem ,每个QTreeWidgetItem 可以包含多个文本和图标,每个文本/图标为⼀个列.可以给QTreeWidget 设置顶层节点(顶层节点可以有多个),然后再给顶层节点添加子节点,从而构成树形结构.

QTreeWidget核心方法

方法说明
clear清空所有子节点addTopLevelItem(QTreeWidgetItem* item) 新增顶层节点
topLevelItem(int index)获取指定下标的顶层节点.
topLevelItemCount()获取顶层节点个数
indexOfTopLevelItem(QTreeWidgetItem* item)查询指定节点是顶层节点中的下标
takeTopLevelItem(int index)删除指定的顶层节点.返回QTreeWidgetItem*表示被删除的元素
currentItem()获取到当前选中的节点,返回QTreeWidgetItem*
setCurrentItem(QTreeWidgetItem* item)选中指定节点
setExpanded(bool)展开/关闭节点
setHeaderLabel(const QString& text)设置TreeWidget 的header名称.

QTreeWidget核心信号

信号说明
currentItemChanged(QTreeWidgetItem* current, QTreeWidgetItem* old)切换选中元素时触发
itemClicked(QTreeWidgetItem* item,int col)点击元素时触发
itemDoubleClicked(QTreeWidgetItem* item,int col)双击元素时触发
itemEntered(QTreeWidgetItem* item,int col)鼠标进入时触发
itemExpanded(QTreeWidgetItem* item)元素被展开时触发
itemCollapsend(QTreeWidgetItem* item)元素被折叠时触发

QTreeWidgetItem核心属性

属性说明
text持有的文本
textAlignment文本对齐方式icon 持有的图表
font文本字体
hidden是否隐藏
disabled是否禁用
expand是否展开
sizeHint尺寸大小
selected是否选中

QTreeWidgetItem的核心方法

方法说明
addChild(QTreeWidgetItem* child)新增子节点
childCount()子节点的个数
child(int index)获取指定下标的子节点.返回QTreeWidgetItem*
takeChild(int index)删除对应下标的子节点
removeChild(QTreeWidgetItem* child)删除对应的子节点
parent()获取该元素的父节点

代码样例:

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);
    // 给底层节点添加孩子
    QTreeWidgetItem* item4 = new QTreeWidgetItem();
    item4->setText(0, "中华田园犬");
    item1->addChild(item4);

    QTreeWidgetItem* item5 = new QTreeWidgetItem();
    item5->setText(0, "哈士奇");
    item1->addChild(item5);

}

void Widget::on_pushButton_clicked()
{
    int column = ui->treeWidget->currentColumn();
    const QString& content = ui->lineEdit->text();
    QTreeWidgetItem* item = new QTreeWidgetItem();
    item->setText(column, content);
    ui->treeWidget->addTopLevelItem(item);
}

void Widget::on_pushButton_2_clicked()
{
    int column = ui->treeWidget->currentColumn();
    const QString& content = ui->lineEdit->text();
    QTreeWidgetItem* item = new QTreeWidgetItem();
    item->setText(column, content);
    QTreeWidgetItem* currentitem = ui->treeWidget->currentItem();
    currentitem->addChild(item);
}

void Widget::on_pushButton_3_clicked()
{
    // 获取选中元素的父亲
    QTreeWidgetItem* curritem = ui->treeWidget->currentItem();
    if (curritem == nullptr){
        return;
    }
    QTreeWidgetItem* parent = curritem->parent();
    if (parent == nullptr){
        int index = ui->treeWidget->indexOfTopLevelItem(curritem);
        qDebug() << index;
        ui->treeWidget->takeTopLevelItem(index);
    }else{
        parent->removeChild(curritem);
    }
}

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

三问走天下

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

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

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

打赏作者

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

抵扣说明:

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

余额充值