当前位置: 首页 > news >正文

QT系列教程(20) Qt 项目视图便捷类

视频连接

https://www.bilibili.com/video/BV1XY41127t3/?vd_source=8be9e83424c2ed2c9b2a3ed1d01385e9

Qt项目视图便捷类

Qt项目视图提供了一些便捷类,包括QListWidget, QTableWidget, QTreeWidget等。我们分别介绍这几个便捷类。
我们先创建一个Qt Application应用,然后在mainwindow的构造函数中创建一个listwidget

    auto listWidget = new QListWidget(this);
    QListWidgetItem * listWidgetItem = new QListWidgetItem;
    listWidgetItem->setText("listItem");
    QPixmap pixmap(50,50);
    pixmap.fill(Qt::blue);
    listWidgetItem->setIcon(pixmap);
    listWidgetItem->setToolTip("this is list item");
    listWidget->insertItem(1,listWidgetItem);

    QListWidgetItem * listWidgetItem2 = new QListWidgetItem;
    listWidgetItem2->setText("listItem2");
    QPixmap pixmap2(50,50);
    pixmap2.fill(Qt::green);
    listWidgetItem2->setIcon(pixmap2);
    listWidgetItem2->setToolTip("this is list item2");
    listWidget->insertItem(2,listWidgetItem2);

    listWidget->sortItems(Qt::DescendingOrder);
    listWidget->show();
    this->setCentralWidget(listWidget);

运行效果如下
https://cdn.llfc.club/1671679301439.jpg

接下来我们在mainwindow.h里添加QTableWidget和QTreeWidget成员变量

    QTreeWidget * _treeWidget;
    QTableWidget * _tableWidget;

然后继续在mainwindow的构造函数中创建TableWidget和TreeWidget。

    _treeWidget = new QTreeWidget();
    //treewidget 要设置列数
    _treeWidget->setColumnCount(2);
    QStringList headers;
    headers << "name" << "year";
    _treeWidget->setHeaderLabels(headers);

    //添加项目

    //父节点是_treeWidget
    QTreeWidgetItem * grade1 = new QTreeWidgetItem(_treeWidget);
    grade1->setText(0,"Grade1");
    //父节点是grade1
    QTreeWidgetItem * student = new QTreeWidgetItem(grade1);
    student->setText(0,"Tom");
    student->setText(1,"1996");

    //父节点是grade1, 在student之后
    QTreeWidgetItem * student2 = new QTreeWidgetItem(grade1, student);
    student2->setText(0,"Zack");
    student2->setText(1,"1988");
    //父节点是_treeWidget, 在grade1之后
    QTreeWidgetItem * grade2 = new QTreeWidgetItem(_treeWidget,grade1);
    grade2->setText(0,"Grade2");

    QTreeWidgetItem * student3 = new QTreeWidgetItem(grade1, student2);
    student3->setText(0,"Will");
    student3->setText(1,"1989");
    _treeWidget->show();

我们创建了一个TreeWidget,创建TreeWidget要指明列数量,然后创建了头信息,接下来利用QTreeWidgetItem的构造函数创建了一些item,两个参数的构造函数,第一个参数是item的父节点,第二个参数是其兄弟节点。运行之后效果如下
https://cdn.llfc.club/1671680216876.jpg
我们可以根据item的父节点是否为空判断其是否为顶层节点,然后执行删除节点操作

    //删除student3,先获取其父节点
    auto *parent_student3 = student3->parent();
    //获取student3在其父节点下的index
    auto index_student3 = parent_student3->indexOfChild(student3);
    //根据index删除student3
    delete parent_student3->takeChild(index_student3);

    //删除grade2
    auto * parent_grade2 = grade2->parent();
    //grade2为顶层节点,所以其父节点必为null
    assert(parent_grade2 == nullptr);
    //通过treewidget获取grade2的index
    auto index_grade2 = _treeWidget->indexOfTopLevelItem(grade2);
    delete _treeWidget->takeTopLevelItem(index_grade2);

创建QTableWidget

    //创建表格指定行号和列号
   _tableWidget =  new QTableWidget(3,2);
    //创建表格项目,将其插入到表格中
    QTableWidgetItem * tableWidgetItem = new QTableWidgetItem("qt");
    _tableWidget->setItem(1,1,tableWidgetItem);
    //创建表头
    QTableWidgetItem * headerV = new QTableWidgetItem("first");
    _tableWidget->setVerticalHeaderItem(0, headerV);
    QTableWidgetItem * headerH = new QTableWidgetItem("ID");
    _tableWidget->setHorizontalHeaderItem(0, headerH);
    _tableWidget->show();

运行效果
https://cdn.llfc.club/1671680542918.jpg

实现拖拽

有时我们需要实现拖拽操作, 我们可以在之前实现的listWidget设置一些拖拽属性。

    //设置list为单选模式
    listWidget->setSelectionMode(QAbstractItemView::SingleSelection);
    //启用拖动
    listWidget->setDragEnabled(true);
    //设置接受拖放
    listWidget->viewport()->setAcceptDrops(true);
    //设置显示将要放置的位置
    listWidget->setDropIndicatorShown(true);
    //设置拖放模式为移动项目,如果不设置,则为复制项目
    listWidget->setDragDropMode(QAbstractItemView::InternalMove);

源码链接

源码链接
https://gitee.com/secondtonone1/qt-learning-notes

相关文章:

  • Spring Boot基础使用详解
  • Oracle 数据库基础入门(七):触发器与事务的深度探究
  • JVM 类加载原理之双亲委派机制(JDK8版本)
  • spring boot3.4.3+MybatisPlus3.5.5+swagger-ui2.7.0
  • Qt 加载插件:实现可扩展应用的秘诀
  • halcon机器人视觉(二)固定相机抓取hand_eye_stationarycam_grasp_nut
  • 【Mastering Vim 2_12】(完结篇)第九章:以终为始 —— Vim 推荐编辑习惯与相关学习资源整理
  • mapbox高阶,结合threejs(threebox)添加管道
  • vscode(cursor)配置python环境,含远程调试
  • MATLAB并行计算加速,用 parfor 和 spmd 榨干多核CPU性能
  • Jeinkins配置sonarqube
  • 网络安全之数据加密(DES、AES、RSA、MD5)
  • PPO算法 - AI学习记录
  • bug-Ant中a-select的placeholder不生效(绑定默认值为undefined)
  • 代理IP与反爬技术的博弈
  • 代码优化——基于element-plus封装组件:表单封装
  • 02C#基本结构篇(D4_注释-访问修饰符-标识符-关键字-运算符-流程控制语句)
  • OpenEuler24.x下ZABBIX6/7实战1:zabbix7.2.4安装及zabbix-agent安装
  • 软考 数据通信基础——信道
  • SpringBoot 如何调用 WebService 接口
  • 中国田径巡回赛西安站完赛:男子跳远石雨豪夺冠
  • 幼儿园教师拍打孩子额头,新疆库尔勒教育局:涉事教师已被辞退
  • 俄乌谈判开始
  • 英德宣布开发射程超2000公里导弹,以防务合作加强安全、促进经济
  • 上海“城市文明开放麦”全城总动员,樊振东担任首位上海城市文明大使
  • 特朗普促卡塔尔说服伊朗放弃核计划,伊朗总统:你来吓唬我们?