项目控件组(基于项)Item-Based-Qt-思维导图-学习笔记

项目控件组(基于项)Item-Based

在这里插入图片描述

控件组

(1)List Widget:清单控件

QListWidget

  • 控件简介

    • 继承关系:继承自 QListView

    • 功能:提供一个基于项的列表小部件,允许添加和删除项目,使用内部模型管理 QListWidgetItem

    • 特点:相比于 QListView,QListWidget 操作更为便捷,不需要用户自行建模,直接使用 addItem 添加项目

  • 用法示例

    • 示例说明

      • 创建用户界面组件

        • 使用 QListWidget 组件来显示音乐文件列表

        • 添加一个按钮用于触发文件选择操作

      • 当用户单击按钮时,程序会调用系统的文件打开窗口

      • 在打开文件选择框时,设置文件过滤器,只显示以 .mp3 结尾的文件

      • 创建示例 mp3 文件

        • 使用 touch 命令在终端创建两个示例文件:0.mp3 和 1.mp3

        • 这两个文件仅作为示例,不是实际的音乐文件

      • 当用户在文件选择框中选择这两个 mp3 文件后,程序将这些文件路径添加为 QListWidget 的项

      • 此操作是实现音乐播放器功能中的一个部分,实际应用中用户需要打开和选择音乐文件

      • 具体实现时需要编写相应的信号槽机制,连接按钮的点击事件与文件选择功能

    • 代码

      • 在新建例程中不要勾选“Generate form”,默认继承 QMainWindow 类即可

      • mainwindow.h

        • 1 #ifndef MAINWINDOW_H
          2 #define MAINWINDOW_H
          3
          4 #include
          5 #include
          6 #include
          7
          8 class MainWindow : public QMainWindow
          9{
          10 Q_OBJECT
          11
          12 public:
          13 MainWindow(QWidget parent = nullptr);
          14 ~MainWindow();
          15
          16 private:
          17 /
          声明对象 */
          18 QListWidget *listWidget;
          19 QPushButton *pushButton;
          20
          21 private slots:
          22 void pushButtonClicked();
          23
          24 };
          25 #endif // MAINWINDOW_H
      • mainwindow.cpp

        • 1 #include “mainwindow.h”
          2 #include “QFileDialog”
          3
          4 MainWindow::MainWindow(QWidget parent)
          5 : QMainWindow(parent)
          6{
          7 /
          设置主窗口的显示位置与大小 /
          8 this->setGeometry(0, 0, 800, 480);
          9
          10 listWidget = new QListWidget(this);
          11
          12 /
          设置 listWidget 的大小 /
          13 listWidget->setGeometry(0, 0, 480, 480);
          14
          15 listWidget->addItem(“请单击右边的添加项添加内容”);
          16
          17 pushButton = new QPushButton(this);
          18
          19 /
          设置 pushButton 的位置与大小 /
          20 pushButton->setGeometry(540, 200, 200, 100);
          21 pushButton->setText(“添加项”);
          22
          23 /
          信号与槽连接 /
          24 connect(pushButton, SIGNAL(clicked()),
          25 this, SLOT(pushButtonClicked()));
          26 }
          27
          28 void MainWindow::pushButtonClicked()
          29 {
          30 /
          调用系统打开文件窗口,设置窗口标题为“打开文件”,过滤文件名 /
          31 QString fileName = QFileDialog::getOpenFileName(
          32 this,tr(“添加项”),“”,
          33 tr("Files(
          .mp3)")
          34 );
          35
          36 /* 判断是否选中打开 mp3 文件 /
          37 if (fileName != NULL)
          38 /
          添加项到列表中 */
          39 listWidget->addItem(fileName);
          40 }
          41
          42 MainWindow::~MainWindow()
          43 {
          44 }
      • main.cpp

        • 1 #include “mainwindow.h”
          2
          3 #include
          4
          5 int main(int argc, char *argv[])
          6{
          7 QApplication a(argc, argv);
          8 MainWindow w;
          9 w.show();
          10 return a.exec();
          11 }
    • 运行效果

      • 当点击添加项按钮时出现系统选择文件的对话框,系统打开文件时会过滤 mp3 后缀的文件,点击后缀为 mp3 的文件,双击或者选择后再点击右上角的“Open”的打开来把这个文件添加到左边的 QListWidget 列表中

(2)TreeWidget:树形控件

QTreeWidget

  • 控件简介

    • 继承关系:继承自 QTreeView

    • 功能:提供一个使用预定义树模型的树视图,方便管理和显示树状结构的数据

    • 特点:基于项的经典接口,每个项为 QTreeWidgetItem,不需要用户自定义模型,直接使用内置的树模型

  • 用法示例

    • 使用一个 TreeWidget,模拟成一个飞信联系人分组,通过选中组内联系人来“群发”信息

    • 思路:当选中顶层的树形节点时,子节点全部被选中;当取消选择顶层树形节点时,子节点原来选中的状态将全部取消;当不完全选中子节时,树节点显示为半选状态

    • 在新建例程中不要勾选“Generate form”,默认继承 QMainWindow 类即可

    • mainwindow.h

      • 1 #ifndef MAINWINDOW_H
        2 #define MAINWINDOW_H
        3
        4 #include
        5 #include
        6 #include
        7
        8 class MainWindow : public QMainWindow
        9{
        10 Q_OBJECT
        11
        12 public:
        13 MainWindow(QWidget parent = nullptr);
        14 ~MainWindow();
        15
        16 private:
        17 /
        QTreeWidget 对象 */
        18 QTreeWidget treeWidget;
        19 /
        顶层树节点 */
        20 QTreeWidgetItem parentItem;
        21 /
        声明三个子节点 /
        22 QTreeWidgetItem subItem[3];
        23
        24 /
        子节点处理函数 /
        25 void updateParentItem(QTreeWidgetItem
        );
        26
        27 private slots:
        28 /
        槽函数 /
        29 void treeItemChanged(QTreeWidgetItem
        , int);
        30
        31 };
        32 #endif // MAINWINDOW_H
    • mainwindow.cpp

      • 1 #include “mainwindow.h”
        2
        3 MainWindow::MainWindow(QWidget parent)
        4 : QMainWindow(parent)
        5{
        6 /
        设置主窗体大小 /
        7 this->setGeometry(0, 0, 800, 480);
        8
        9 /
        实例化 /
        10 treeWidget = new QTreeWidget(this);
        11
        12 /
        居中 /
        13 setCentralWidget(treeWidget);
        14
        15 /
        清空列表 /
        16 treeWidget->clear();
        17
        18 /
        实例化顶层树节点 /
        19 parentItem = new QTreeWidgetItem(treeWidget);
        20 parentItem->setText(0, “同事”);
        21
        22 parentItem->setFlags(
        23 Qt::ItemIsUserCheckable
        24 | Qt::ItemIsEnabled
        25 | Qt::ItemIsSelectable
        26 );
        27 /
        树节点设置为未选中 /
        28 parentItem->setCheckState(0, Qt::Unchecked);
        29
        30 /
        字符串链表 /
        31 QList strList;
        32 strList<<“关羽”<<“刘备”<<“张飞”;
        33
        34 for (int i = 0; i < 3; i++){
        35 /
        实例化子节点 /
        36 subItem[i] = new QTreeWidgetItem(parentItem);
        37 /
        设置子节点的文本,参数 0 代表第 0 列 /
        38 subItem[i]->setText(0, strList[i]);
        39 /
        设置子节点的属性为用户可选、项开启、项可选 /
        40 subItem[i]->setFlags(
        41 Qt::ItemIsUserCheckable
        42 | Qt::ItemIsEnabled
        43 | Qt::ItemIsSelectable
        44 );
        45 /
        设置子节点的状态为未选中 /
        46 subItem[i]->setCheckState(0,Qt::Unchecked);
        47 }
        48 /
        信号槽连接 /
        49 connect(treeWidget,SIGNAL(itemChanged(QTreeWidgetItem
        , int)),
        50 this, SLOT(treeItemChanged(QTreeWidgetItem* , int)));
        51
        52 }
        53
        54 /* 更新树节点函数 /
        55 void MainWindow::updateParentItem(QTreeWidgetItem item)
        56 {
        57 /
        获取子节点的父节点(树节点) /
        58 QTreeWidgetItem
        parent = item->parent();
        59 if(parent == NULL){
        60 return;
        61 }
        62 /
        初始化选中的数目为 0,下面根据 selectCount 来判断树节点的状态 /
        63 int selectCount = 0;
        64 /
        获取树节点的子节点总数 /
        65 int childCount = parent->childCount();
        66 /
        循环判断子节点的状态 /
        67 for(int i = 0; i < childCount; i ++){
        68 QTreeWidgetItem
        childItem =parent->child(i);
        69 /* 判断当前子节点的状是否为选中状态,如果是,则加一 /
        70 if(childItem->checkState(0) == Qt::Checked) {
        71 selectCount ++;
        72 }
        73 }
        74 /
        根据 selectCount 来判断树节点的状态 /
        75 /
        当选中的子节点小于或等于 0 时,则为设置树节点为未选中状态 /
        76 if (selectCount <= 0) {
        77 /
        设置树节点为未选中状态 /
        78 parent->setCheckState(0, Qt::Unchecked);
        79 /
        部分选中时,树节点为半选状态 /
        80 } else if (selectCount > 0 && selectCount < childCount) {
        81 /
        设置为半选状态 /
        82 parent->setCheckState(0, Qt::PartiallyChecked);
        83 /
        子节点全选时 /
        84 } else if (selectCount == childCount){
        85 /
        设置为树节点为选中状态 */
        86 parent->setCheckState(0, Qt::Checked);
        87 }
        88 }
        89
        90 void MainWindow::treeItemChanged(QTreeWidgetItem item, int)
        91 {
        92 /
        获取子节点总数 /
        93 int count = item->childCount();
        94
        95 /
        若顶层树节点选中 /
        96 if(Qt::Checked == item->checkState(0) ) {
        97 /
        若选中的项是树节点,count 会大于 0,否则选中的项是子节点 /
        98 if (count > 0) {
        99 for (int i = 0; i < count; i++) {
        100 /
        子节点全选 /
        101 item->child(i)->setCheckState(0, Qt::Checked);
        102 }
        103 } else {
        104 /
        子节点处理 /
        105 updateParentItem(item);
        106 }
        107 /
        若顶层树节点取消选中时 /
        108 } else if (Qt::Unchecked == item->checkState(0)) {
        109 if (count > 0){
        110 /
        若选中的项是树节点,count 会大于 0,否则选中的项是子节点 /
        111 for (int i = 0; i < count; i++) {
        112 /
        子节点全不选 /
        113 item->child(i)->setCheckState(0, Qt::Unchecked);
        114 }
        115 } else {
        116 /
        子节点处理 */
        117 updateParentItem(item);
        118 }
        119 }
        120 }
        121
        122 MainWindow::~MainWindow()
        123 {
        124 }
    • main.cpp

      • 由新建项目时生成,无改动
  • 运行效果

    • 全选时的状态

(3)Table Widget:表控件

QTableWidget

  • 控件简介

    • 继承关系:继承自 QTableView

    • 功能:提供一个带有默认模型的基于项的表视图,用于显示和管理表格数据

    • 特点:使用 QTableWidgetItem 管理表格中的项,简化了表格数据的管理操作,用户无需自行创建模型

  • 用法示例

    • 使用一个 TableWidget,绘制一
      个表格,同时修改项的标题,在表格里可以直接通过双击进行编辑项里的内容,也可以删除项里的内容等

    • 在新建例程中不要勾选“Generate form”,默认继承 QMainWindow 类即可

    • mainwindow.h

      • 1 #ifndef MAINWINDOW_H
        2 #define MAINWINDOW_H
        3
        4 #include
        5 #include
        6
        7 class MainWindow : public QMainWindow
        8{
        9 Q_OBJECT
        10
        11 public:
        12 MainWindow(QWidget parent = nullptr);
        13 ~MainWindow();
        14
        15 private:
        16 /
        QTabelWidget 表格 */
        17 QTableWidget tableWidget;
        18
        19 /
        QTabelWidgetItem 表格数据(项) */
        20 QTableWidgetItem *tableWidgetItem[4];
        21
        22 };
        23 #endif // MAINWINDOW_H
    • mainwindow.cpp

      • 1 #include “mainwindow.h”
        2
        3 MainWindow::MainWindow(QWidget parent)
        4 : QMainWindow(parent)
        5{
        6 /
        设置主窗体的大小与位置 /
        7 this->setGeometry(0, 0, 800, 480);
        8
        9 /
        实例化 /
        10 tableWidget = new QTableWidget(this);
        11 /
        设置 tableWidget 表居中 /
        12 setCentralWidget(tableWidget);
        13 /
        设置列数 /
        14 tableWidget->setColumnCount(2);
        15 /
        设置行数 /
        16 tableWidget->setRowCount(2);
        17 /
        使用标签设置水平标题标签 /
        18 tableWidget->setHorizontalHeaderLabels(
        19 QStringList()<<“姓名”<<“性别”
        20 );
        21
        22 /
        字符串类型链表 /
        23 QList strList;
        24 strList<<“小明”<<“小红”<<“男”<<“女”;
        25
        26 for (int i = 0; i < 4; i++) {
        27 /
        实例化 /
        28 tableWidgetItem[i] = new QTableWidgetItem(strList[i]);
        29 /
        设置文本居中对齐 /
        30 tableWidgetItem[i]->setTextAlignment(Qt::AlignCenter);
        31 }
        32 /
        插入数据,表的 index 就是一个二维数组数据 */
        33 tableWidget->setItem(0, 0, tableWidgetItem[0]);
        34 tableWidget->setItem(1, 0, tableWidgetItem[1]);
        35 tableWidget->setItem(0, 1, tableWidgetItem[2]);
        36 tableWidget->setItem(1, 1, tableWidgetItem[3]);
        37
        38 }
        39
        40 MainWindow::~MainWindow()
        41 {
        42 }
    • main.cpp

      • 由新建项目时生成,无改动
  • 运行效果

    • 双击表格中的项,可修改表格的内容,同时也可以删除内容
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

木木不迷茫(˵¯͒¯͒˵)

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

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

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

打赏作者

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

抵扣说明:

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

余额充值