QT-常用控件(多元素控件)

目录

前言

QListWidget(纵向列表)

QTableWidget(表格)

QTreeWidget


前言

QListWidget--------->列表

QListView

QTableWidget-------->表格

QTableView

QTreeWidget---------->树状结构

QTreeView

widget与view的区别在于,view是更加底层的,而widget是基于view进行封装实现的。

  1. MVC 是软件开发中经典的软件结构组织形式,包含:

    • M model 数据
    • V view 视图 (界面)
    • C controller 控制器,处理数据和视图之间的业务流程
  2. xxView 仅负责实现视图,不处理数据存储表示和数据视图交互

  3. 使用 xxView 需要程序员自己实现 model 和 controller 部分,比较麻烦

  4. xxWidget 基于 xxView,同时实现了 model 和 controller,提供了方便的 API,使用简单

QListWidget(纵向列表)

核心方法:

样例:

cpp 复制代码
#include "widget.h"
#include "ui_widget.h"
#include<QDebug>
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_pushButton_clicked()
{
    QString text=ui->lineEdit->text();
    if(text!=nullptr)
        ui->listWidget->addItem(text);
}

void Widget::on_pushButton_2_clicked(bool checked)
{
    int row=ui->listWidget->currentRow();
    if(row<0)return;
    ui->listWidget->takeItem(row);
}

void Widget::on_listWidget_currentItemChanged(QListWidgetItem *current, QListWidgetItem *previous)
{
    if(current!=nullptr)
        qDebug()<<"cur"<<current->text();
    if(previous!=nullptr)
        qDebug()<<"pre"<<previous->text();
}

样例

QTableWidget(表格)

表格每一行是一个QTableWidget Item对象

表格的创建操作:

cpp 复制代码
ui->setupUi(this);

// 创建 3 行
ui->tableWidget->insertRow(0);
ui->tableWidget->insertRow(1);
ui->tableWidget->insertRow(2);

// 创建 3 个列
ui->tableWidget->insertColumn(0);
ui->tableWidget->insertColumn(1);
ui->tableWidget->insertColumn(2);

// 给 3 个列设定列名(设置水平方向的表头)
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("19"));

ui->tableWidget->setItem(2, 0, new QTableWidgetItem("1003"));
ui->tableWidget->setItem(2, 1, new QTableWidgetItem("王五"));
ui->tableWidget->setItem(2, 2, new QTableWidgetItem("23"));

通过按钮进行行的增删

cpp 复制代码
void Widget::on_pushButton_insertRow_clicked()
{
    // 需要知道当前一共有多少行
    int rowCount = ui->tableWidget->rowCount();
    // 在最后一行之后新增行
    // 注意此处的参数是"下标",表示你新增之后的这一行是第几行
    ui->tableWidget->insertRow(rowCount);
}
void Widget::on_pushButton_deleteRow_clicked()
{
    // 获取到选中的行号
    int curRow = ui->tableWidget->currentRow();
    // 删除这一行
    ui->tableWidget->removeRow(curRow);
}

按钮进行列的增删

cpp 复制代码
void Widget::on_pushButton_insertColumn_clicked()
{
    // 先获取到一共有几列
    int colCount = ui->tableWidget->columnCount();
    // 在对应的位置新增一列.
    ui->tableWidget->insertColumn(colCount);
    // 设置列名(从输入框中获取到)
    const QString& text = ui->lineEdit->text();
    ui->tableWidget->setHorizontalHeaderItem(colCount, new QTableWidgetItem(text));
}
void Widget::on_pushButton_deleteColumn_clicked()
{
    // 获取到选中的列号
    int curCol = ui->tableWidget->currentColumn();
    // 删除这一列
    ui->tableWidget->removeColumn(curCol);
}

QTreeWidget

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

顶层节点的添加

cpp 复制代码
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);

子节点的添加

cpp 复制代码
// 添加一些子节点
QTreeWidgetItem* item4 = new QTreeWidgetItem();
item4->setText(0, "中华田园猫");
item1->addChild(item4);

QTreeWidgetItem* item5 = new QTreeWidgetItem();
item5->setText(0, "布偶猫");
item1->addChild(item5);

QTreeWidgetItem* item6 = new QTreeWidgetItem();
item6->setText(0, "暹罗猫");
item1->addChild(item6);

通过按钮实现节点的添加

cpp 复制代码
void Widget::on_pushButton_insertItem_clicked()
{
    // 获取到当前选中的节点
    QTreeWidgetItem* currentItem = ui->treeWidget->currentItem();
    if (currentItem == nullptr) {
        return;
    }
    // 获取到输入框的内容
    const QString& text = ui->lineEdit->text();
    // 构造一个 QTreeWidgetItem
    QTreeWidgetItem* item = new QTreeWidgetItem();
    item->setText(0, text);
    // 插入到选中节点的子节点中
    currentItem->addChild(item);
}

通过按钮实现节点的删除

cpp 复制代码
void Widget::on_pushButton_deleteItem_clicked()
{
    // 获取到选中的元素
    QTreeWidgetItem* currentItem = ui->treeWidget->currentItem();
    if (currentItem == nullptr) {
        return;
    }
    // 删除选中的元素,需要先获取到父元素,通过父元素进行删除
    QTreeWidgetItem* parent = currentItem->parent();
    if (parent == nullptr) {
        // 顶层元素
        int index = ui->treeWidget->indexOfTopLevelItem(currentItem);
        ui->treeWidget->takeTopLevelItem(index);
    } else {
        // 普通元素
        parent->removeChild(currentItem);
    }
}
相关推荐
阳懿4 分钟前
meta-llama-3-8B下载失败解决。
前端·javascript·html
Qinana5 分钟前
🌊 深入理解 CSS:从选择器到层叠的艺术
前端·css·程序员
IT_陈寒5 分钟前
Python 3.12新特性实测:10个让你的代码提速30%的隐藏技巧 🚀
前端·人工智能·后端
闲人编程12 分钟前
从零开发一个简单的Web爬虫(使用Requests和BeautifulSoup)
前端·爬虫·beautifulsoup·bs4·web·request·codecapsule
硅农深芯13 分钟前
如何使用ptqt5实现进度条的动态显示
开发语言·python·qt
紫小米17 分钟前
Vue 2 和 Vue 3 的区别
前端·javascript·vue.js
dllxhcjla32 分钟前
三大特性+盒子模型
java·前端·css
Lhan.zzZ34 分钟前
Qt数据可视化实战:饼图、线图与表格的完整指南
开发语言·qt·信息可视化
Acrelhuang36 分钟前
筑牢用电防线:Acrel-1000 自动化系统赋能 35kV 园区高效供电-安科瑞黄安南
java·大数据·开发语言·人工智能·物联网
Cache技术分享39 分钟前
233. Java 集合 - 遍历 Collection 中的元素
前端·后端