【QT】ItemWidget (QListWidget、QTreeWidget、QTableWidget)

QListWidget(列表控件)

QListWidget列表控件,用于显示和管理列表项(如文本、图片、图标等)。它继承自 QListView,并且具有内置的模型视图结构,简化了数据处理,适用于简单的列表场景

属性设置介绍

  • 如果想隐藏边框,可以将 frameShape 设为 NoFrame
  • 可以让滚动条一直显示
    • verticalScrollBarPolicy = ScrollBarAlwaysOn
    • horizontalScrollBarPolicy = ScrollBarAlwaysOn

如果想支持多选,可以修改:

  • selectionMode = MultiSelection(多选)
  • selectionMode = ExtendedSelection(Shift + Click 选择范围)

如果想支持拖放排序

  • dragEnabled = true
  • dragDropMode = InternalMove

修改 flow 可以调整排列方向

  • TopToBottom:从上到下(默认)
  • LeftToRight:从左到右(横向排列)

修改 viewMode 可以改变显示模式

  • ListMode:标准列表(单列)
  • IconMode:网格排列(适合文件浏览)

常用方法

方法功能
addItem(QString)添加单个列表项(文本)
addItem(QListWidgetItem *)添加带属性的 QListWidgetItem
addItems(QStringList)添加多个文本项
insertItem(int row, QString)在指定行插入新项
takeItem(int row)移除指定行的项
item(int row)获取指定行的项
clear()清空所有项
count()获取当前列表的项数
setCurrentRow(int row)设置当前选中项
currentItem()获取当前选中的项
selectedItems()获取所有选中的项

信号与槽

信号触发时机
itemClicked(QListWidgetItem *item)单击项目时触发
itemDoubleClicked(QListWidgetItem *item)双击项目时触发
itemSelectionChanged()选中项目更改时触发
currentItemChanged(QListWidgetItem *current, QListWidgetItem *previous)当前选中项目改变时触发

综合示例

UI 设计师界面设计

mainwodow.h

mainwindow.cpp

#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QDebug>
#include <QListWidget>
#include <QMessageBox>
MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
    , ui(new Ui::MainWindow)
{
    ui->setupUi(this);
    //添加单个项目
    ui->listWidget->addItem("雷军");
    ui->listWidget->addItem("马斯克");
    //添加带属性的项目
    QListWidgetItem *item = new QListWidgetItem("man");
    item->setIcon(QIcon(":/image/man.jpg"));
    item->setToolTip("这是man");
    //设置图标大小
    ui->listWidget->setIconSize(QSize(30,30));
    ui->listWidget->addItem(item);

    //添加多个项目
    QStringList itemList = {"马云","马化腾","余承东","阿诺","蔡徐坤","周杰伦","汪峰"};
    ui->listWidget->addItems(itemList);

}

MainWindow::~MainWindow()
{
    delete ui;
}

//点击item时触发
void MainWindow::on_listWidget_itemClicked(QListWidgetItem *item)
{
    qDebug()<<"你单击的列表项文本内容是: "<<item->text();
}

//通过索引删除item
void MainWindow::on_pushButton_clicked()
{
    //获取你选择的索引号
    int num = ui->spinBox->value();
    //删除列表项(删除后重新从0索引开始计算)
    ui->listWidget->takeItem(num);
}

//通过名字删除
void MainWindow::on_pushButton_2_clicked()
{
    //获取单行输入框输入的人名
    QString name = ui->lineEdit->text();
    //通过人名找到对应的列表项指针
    auto ret = ui->listWidget->findItems(name,Qt::MatchContains);

    //判断这个人名对应的列表项是否存在
    if(!ret.empty())
    {
        //循环删除所有重复的选项
        for(int i = 0; i < ret.size();i++)
        {
            //通过列表项指针得到对应的索引号
            int num = ui->listWidget->row(ret.at(i));
            //删除这个列表项
            ui->listWidget->takeItem(num);
        }
    }else {
        QMessageBox::warning(this,"不存在","sorry,没有你要删除的人");
    }
}

效果

你还可以添加带复选框的列表项

QListWidgetItem *item = new QListWidgetItem("复选框项目");
item->setCheckState(Qt::Unchecked);  // 初始未选中
ui->listWidget->addItem(item);

//检测复选框变化
void MainWindow::onItemClicked(QListWidgetItem *item)
{
    if (item->checkState() == Qt::Checked) {
        qDebug() << item->text() << "已选中";
    } else {
        qDebug() << item->text() << "未选中";
    }
}


QTreeWidget(树状列表)

ListWidget不同的是TreeWidget支持父子关系,而ListWidget是一维列表,每个item是平级的,因此TreeWidget非常适合用来展示层级结构如文件系统、目录等。

属性设置介绍

  • 这里只介绍QTreeWidget独有的属性,其他均和listWidget一致

常用方法

功能方法示例
设置表头setHeaderLabels(QStringList &labels)treeWidget->setHeaderLabels("文件列表");
添加根节点addTopLevelItem(QTreeWidgetItem*)tree->addTopLevelItem(item);
添加子节点addChild(QTreeWidgetItem *)parent->addChild(child);
查找顶层节点findItems(QString &text,Qt::MatchFlags flags, int column = 0)treeWidget>findItems(str,Qt::MatchContains);
获取根节点数量topLevelItemCount()tree->topLevelItemCount();
获取指定根节点topLevelItem(int index)tree->topLevelItem(0);
获取子节点数量childCount()item->childCount();
获取子节点child(int index)item->child(0);
获取/设置文本text(int column) / setText(int column, QString text)item->setText(0, "Node");
设置复选框setCheckState(int column, Qt::CheckState state)item->setCheckState(0, Qt::Checked)
  • findItems无法查找子节点,因此需要查找子节点需要自己遍历顶层节点下的所有子节点。

信号与槽

信号用途
itemClicked()点击节点
itemDoubleClicked()双击节点
currentItemChanged()选中项变化
itemChanged()节点文本/复选框状态变化
itemExpanded()展开节点
itemCollapsed()折叠节点
itemSelectionChanged()选中的节点变化
itemEntered()鼠标悬停

综合示例

UI 设计师界面设计

mainwindow.h

#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>
#include <QTreeWidgetItem>
QT_BEGIN_NAMESPACE
namespace Ui {
class MainWindow;
}
QT_END_NAMESPACE

class MainWindow : public QMainWindow
{
    Q_OBJECT

public:
    MainWindow(QWidget *parent = nullptr);
    ~MainWindow();

private slots:
    void on_treeWidget_itemDoubleClicked(QTreeWidgetItem *item, int column);

    void on_pushButton_clicked();

private:
    Ui::MainWindow *ui;
};
#endif // MAINWINDOW_H

mainwindow.cpp

#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QDebug>
#include <QMessageBox>
MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
    , ui(new Ui::MainWindow)
{
    ui->setupUi(this);

    //第一步:设置水平头
    ui->treeWidget->setHeaderLabel("QQ好友");

    //第二步:添加根节点--》分组名字
    QStringList list1;
    list1.append("小学同学");
    QTreeWidgetItem *item1=new QTreeWidgetItem(list1);
    ui->treeWidget->addTopLevelItem(item1);

    QStringList list2;
    list2.append("篮球群");
    QTreeWidgetItem *item2=new QTreeWidgetItem(list2);
    ui->treeWidget->addTopLevelItem(item2);

    QStringList list3;
    list3.append("王者荣耀群");
    QTreeWidgetItem *item3=new QTreeWidgetItem(list3);
    ui->treeWidget->addTopLevelItem(item3);

    //第三步:添加子节点(拉人进分组)
    QStringList list20;
    list20.append("科比");
    QTreeWidgetItem *item20=new QTreeWidgetItem(list20);
    //设置图标
    item20->setIcon(0,QIcon("C:/Users/28494/Desktop/gif录制/man.jpg"));
    //调整图标大小
    ui->treeWidget->setIconSize(QSize(28,28));

    item2->addChild(item20);
    QStringList list21;
    list21.append("姚明");
    QTreeWidgetItem *item21=new QTreeWidgetItem(list21);
    item2->addChild(item21);
}

MainWindow::~MainWindow()
{
    delete ui;
}

void MainWindow::on_treeWidget_itemDoubleClicked(QTreeWidgetItem *item, int column)
{
    //获取你双击列表项文本内容
    qDebug()<<"列号: "<<column;
    qDebug()<<"你双击是: "<<item->text(column);
}


void MainWindow::on_pushButton_clicked()
{
    QString str = ui->lineEdit->text();  // 获取要查找的节点名称

    // 遍历所有顶层节点
    for (int i = 0; i < ui->treeWidget->topLevelItemCount(); ++i) {
        QTreeWidgetItem *parent = ui->treeWidget->topLevelItem(i);

        // 遍历该顶层节点的所有子节点
        for (int j = 0; j < parent->childCount(); ++j) {
            QTreeWidgetItem *child = parent->child(j);

            if (child->text(0) == str) {  // 找到匹配的子节点
                delete parent->takeChild(j);  // 删除子节点
                qDebug() << "已删除节点: " << str;
                return;  // 只删除一个,删除后立即退出
            }
        }
    }

    QMessageBox::warning(this, "提示", "未找到该子节点");
}


QTbaleWidget(表格列表)

QTableWidgetQTableView 的子类,它用于显示 基于表格的二维数据,并且 不需要手动创建 QAbstractTableModel,非常适合 小型数据展示

属性设置介绍


常用方法

函数作用示例代码
QTableWidget(int rows, int columns, QWidget *parent = nullptr)构造函数,创建一个表格控件,指定初始行数和列数QTableWidget *tableWidget = new QTableWidget(3, 3, this);
setRowCount(int count)设置表格的行数tableWidget->setRowCount(5);
setColumnCount(int count)设置表格的列数tableWidget->setColumnCount(3);
setHorizontalHeaderLabels(const QStringList &labels)设置 水平表头(列标题)tableWidget->setHorizontalHeaderLabels({"姓名", "年龄", "性别"});
setVerticalHeaderLabels(const QStringList &labels)设置垂直表头(行标题)tableWidget->setVerticalHeaderLabels({"A", "B", "C"});
setItem(int row, int column, QTableWidgetItem *item)指定单元格设置文本内容tableWidget->setItem(0, 0, new QTableWidgetItem("张三"));
item(int row, int column)获取指定单元格的QTableWidgetItemQTableWidgetItem *item = tableWidget->item(0, 0);
setCellWidget(int row, int column, QWidget *widget)在单元格中添加控件(如按钮、复选框等)tableWidget->setCellWidget(0, 1, new QPushButton("点击"));
cellWidget(int row, int column)获取单元格中的 控件QWidget *widget = tableWidget->cellWidget(0, 1);
insertRow(int row)指定位置插入新行tableWidget->insertRow(2);
insertColumn(int column)指定位置插入新列tableWidget->insertColumn(1);
removeRow(int row)删除指定行tableWidget->removeRow(1);
removeColumn(int column)删除指定列tableWidget->removeColumn(0);
clearContents()清空所有单元格内容(不删除表头和行列)tableWidget->clearContents();
clear()清空整个表格(包括行列和表头)tableWidget->clear();
resizeColumnsToContents()自动调整列宽适应内容tableWidget->resizeColumnsToContents();
resizeRowsToContents()自动调整行高适应内容tableWidget->resizeRowsToContents();
setSortingEnabled(bool enable)是否启用排序(点击表头排序)tableWidget->setSortingEnabled(true);
sortItems(int column, Qt::SortOrder order指定列排序tableWidget->sortItems(0, Qt::AscendingOrder);
setSpan(int row, int column, int rowSpan, int columnSpan)合并单元格tableWidget->setSpan(0, 0, 2, 1);

QTableWidgetItem常用方法与构造

QTableWidgetItemQTableWidget 中的一个重要类,它表示表格中的一个单元格项,可以用来设置单元格的文本、图标、状态等。

函数作用示例代码
**<font style="color:rgb(36, 41, 47);">QTableWidgetItem(const QString &text)构造函数:创建一个显示文本的单元格项QTableWidgetItem *item = new QTableWidgetItem("张三");
setText(const QString &text)设置单元格项的文本item->setText("李四");
text()获取单元格项的文本qDebug() << item->text();
setIcon(const QIcon &icon)设置单元格项的图标item->setIcon(QIcon(":/images/icon.png"));
icon()获取单元格项的图标QIcon icon = item->icon();
setFlags(Qt::ItemFlags flags)设置单元格项的标志,如是否可编辑item->setFlags(Qt::ItemIsEditable);
setBackground(const QBrush &brush)设置单元格的背景色item->setBackground(QBrush(Qt::yellow));
setTextAlignment(Qt::Alignment alignment)设置单元格文本的对齐方式item->setTextAlignment(Qt::AlignCenter);

信号与槽


综合示例

UI 设计师界面设计


mainwindow.h

#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>
#include <QTableWidgetItem>
QT_BEGIN_NAMESPACE
namespace Ui {
class MainWindow;
}
QT_END_NAMESPACE

class MainWindow : public QMainWindow
{
    Q_OBJECT

public:
    MainWindow(QWidget *parent = nullptr);
    ~MainWindow();

private slots:
    void on_tableWidget_cellClicked(int row, int column);

    void on_tableWidget_itemClicked(QTableWidgetItem *item);

    void on_pushButton_clicked();

private:
    Ui::MainWindow *ui;
};
#endif // MAINWINDOW_H

mainwindow.cpp

#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QDebug>
MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
    , ui(new Ui::MainWindow)
{
    ui->setupUi(this);
    //第一步:设置表格的列数--》三列  姓名  成绩  学校
    ui->tableWidget->setColumnCount(3); //3列

    //第二步:设置字段名
    QStringList list;
    list.append("姓名");
    list.append("成绩");
    list.append("学校");
    ui->tableWidget->setHorizontalHeaderLabels(list);

    //第三步:设置表格的行数
    ui->tableWidget->setRowCount(10);

    //第四步:添加文本内容
    QTableWidgetItem *item00=new QTableWidgetItem(QIcon("C:/Users/Administrator/Desktop/share/lj.jpg"),"雷军");
    item00->setTextAlignment(Qt::AlignHCenter); //设置对齐方式,居中
    ui->tableWidget->setItem(0,0,item00);
    QTableWidgetItem *item01=new QTableWidgetItem("100");
    item01->setTextAlignment(Qt::AlignHCenter); //设置对齐方式,居中
    ui->tableWidget->setItem(0,1,item01);
    QTableWidgetItem *item02=new QTableWidgetItem("武汉大学");
    item02->setTextAlignment(Qt::AlignHCenter); //设置对齐方式,居中
    ui->tableWidget->setItem(0,2,item02);

    //设置列宽,行高
    ui->tableWidget->setColumnWidth(0,150);  //列宽
    ui->tableWidget->setColumnWidth(1,150);  //列宽
    ui->tableWidget->setColumnWidth(2,150);  //列宽

    //拓展拓展,不知道也没关系,表格列表框可以添加任意组件到单元格
    QPushButton *bt1=new QPushButton("按钮");
    //把按钮添加到单元格
    ui->tableWidget->setCellWidget(1,0,bt1);
}

MainWindow::~MainWindow()
{
    delete ui;
}

void MainWindow::on_tableWidget_cellClicked(int row, int column)
{
    qDebug()<<"行列:  "<<row<<"  "<<column;
}


void MainWindow::on_tableWidget_itemClicked(QTableWidgetItem *item)
{
    qDebug()<<"列表项的文本内容: "<<item->text();
}


//删除列表项,QT所有的删除有关的方法,基本上都是  removexxx  takexxx
void MainWindow::on_pushButton_clicked()
{
    //获取行下标
    QString r=ui->lineEdit->text();
    //获取列下标
    QString c=ui->lineEdit_2->text();
    //依据行列下标删除单元格内容
    ui->tableWidget->takeItem(r.toInt(),c.toInt());

}

效果

### Qt Designer 中 Item Widgets 的使用 #### 使用 QListWidget 控件 在 Qt Designer 中,`QListWidget` 是一种列表视图控件,允许用户显示项目列表并与其交互。为了向 `QListWidget` 添加条目,可以按照如下方式操作: 通过 C++ 或 Python 代码动态添加条目的例子如下所示[^2]: ```cpp #include <QListWidget> // 创建一个新的 QListWidgetItem 并设置其文本为 "标题" QListWidgetItem *qitem = new QListWidgetItem("标题"); // 将新创建的条目添加到 listWidget 中 ui->listWidget->addItem(qitem); // 设置条目的对齐方式为中心对齐 qitem->setTextAlignment(Qt::AlignCenter | Qt::AlignVCenter); // 向 listWidget 中批量添加字符串列表作为新的条目 QStringList slist; slist << "111222"; slist << "333444"; ui->listWidget->addItems(slist); ``` #### 配置 QTreeWidget 控件 对于树形结构的数据展示需求,则可以选择 `QTreeWidget` 来构建分层式的节点关系。 - **添加顶层项** 可以调用 `QTreeWidgetItem(QTreeWidget*)` 构造函数来实例化顶级项,并将其加入到 `QTreeWidget` 容器内。 - **追加子级项** 利用 `addChild()` 方法可以在已有的父节点下挂载更多层次的孩子节点;也可以直接利用带参数版本的构造函数指定父对象完成嵌套定义。 下面是一个简单的示例说明如何初始化一棵具有两层深度的小型树状结构[^3]: ```cpp QTreeWidgetItem* rootItem = new QTreeWidgetItem(ui->treeWidget, QStringList() << "Root"); for (int i=0;i<5;++i){ QString childText(QString("Child %1").arg(i)); QTreeWidgetItem* item = new QTreeWidgetItem(rootItem, QStringList()<<childText); } ``` #### 应用 QTableWidget 表格组件 当涉及到二维表格形式的信息呈现时,`QTableWidget` 成为了理想的选择之一。此部件支持行列布局以及单元格级别的编辑功能。 要填充表单内容,通常先设定好行数列数再逐个位置填入具体数值即可。另外还存在一些辅助性的接口帮助调整样式属性比如字体颜色大小等等[^1]: ```cpp // 假设我们有一个名为 tableWidgetQTableWidget 实例 tableWidget->setRowCount(3); // 设定三行 tableWidget->setColumnCount(4); // 和四列 // 插入数据至特定坐标处 for(int row = 0 ;row<tableWidget->rowCount();++row){ for(int col = 0;col<tableWidget->columnCount(); ++col){ QTableWidgetItem *newItem = new QTableWidgetItem(QString("%1,%2").arg(row).arg(col)); newItem->setTextAlignment(Qt::AlignHCenter | Qt::AlignVCenter); tableWidget->setItem(row,col,newItem); } } // 如果想要修改某一行的高度或者某一列宽度的话 tableWidget->setRowHeight(0,80); // 改变第零行高度为80像素 tableWidget->setColumnWidth(1,120); // 调整第二列宽幅达到120px ``` 以上就是在 Qt Designer 下运用三种不同类型的 Item Widget 组件的方法概述。每种 widget 提供了丰富的 API 接口让用户能够灵活定制外观行为特性满足实际应用场景下的多样化要求。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值