QT 项目视图(QListView&QTreeView&QTableView)和项目部件(QListWidget&QTreeWidget&QTableWidget)详解-1

简介: QT 项目视图(QListView&QTreeView&QTableView)和项目部件(QListWidget&QTreeWidget&QTableWidget)详解

一、Qt 项目视图(Item Views)      

控件名称依次解释如下:

  • List View:清单视图
  • Tree View: 树视图
  • Table View:表视图
  • Column View: 列视图
  • Undo View : 撤销命令视图


1.QListView

QListView是一个用于显示列表数据的Qt GUI组件。它基于模型/视图(Model/View)架构,可以通过QAbstractItemModel和其派生类来控制数据显示和交互。QListView提供了多种可视化选项,包括图标、文本、复选框等。


QListView的一些特性:


  1. 可以通过选择模式来控制用户交互,如单选、多选等。
  2. 可以对列表项进行排序。
  3. 可以通过自定义委托类来实现自定义外观和交互。
  4. 支持拖放、剪贴板复制和粘贴等操作。
  5. 可以通过设置多种属性来控制其行为和外观。
  6. 可以与其它Qt组件如QTreeView、QTableView等组合使用,实现更加复杂的模型/视图交互。


案例分析:


widget.h        

#ifndef WIDGET_H
#define WIDGET_H
 
#include <QWidget>
 
#include <QListView>
#include <QStringListModel> // 字符串列表模型
#include <QMessageBox>
 
QT_BEGIN_NAMESPACE
namespace Ui { class Widget; }
QT_END_NAMESPACE
 
class Widget : public QWidget
{
    Q_OBJECT
 
public:
    Widget(QWidget *parent = nullptr);
    ~Widget();
 
private:
    Ui::Widget *ui;
 
private:
    QListView *listview1;
private slots:
    void SlotClickedFunc(const QModelIndex &index);
 
};
#endif // WIDGET_H

main.cpp

#include "widget.h"
 
#include <QApplication>
 
int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    Widget w;
    w.show();
    return a.exec();
}

widget.cpp

#include "widget.h"
#include "ui_widget.h"
 
Widget::Widget(QWidget *parent)
    : QWidget(parent)
    , ui(new Ui::Widget)
{
    ui->setupUi(this);
 
    resize(450,250);
 
    listview1 = new QListView(this);
    listview1->setGeometry(20,20,240,160);
 
    // 创建数据显示至清单视图(之前)
    QStringList qlist;
    qlist.append("运动类:篮球、足球");
    qlist.append("娱乐类:看电影、写小说、听音乐");
    qlist.append("游戏类:五子棋、扑克牌、中国象棋");
    qlist.append("旅游类:国外旅游、国内旅游");
 
    // 用数据列表创建数据显示模型进行实现
    QStringListModel *listmode = new QStringListModel(qlist);
    listview1->setModel(listmode);
 
    connect(listview1,SIGNAL(clicked(const QModelIndex)),this,SLOT(SlotClickedFunc(const QModelIndex)));
}
 
Widget::~Widget()
{
    delete ui;
}
 
void Widget::SlotClickedFunc(const QModelIndex &index)
{
    QMessageBox::information(NULL,"兴趣爱好","你选的类型为:\n"+index.data().toString());
}
 

编译执行结果:

2.QTreeView

QTreeView是一个QT控件,通常用于显示和编辑树形结构数据。它是基于MVC(Model-View-Controller)设计模式构建的。 QTreeView提供了一种简单而强大的方式来展示具有层次结构的数据,例如文件系统目录结构或组织机构。


QTreeView支持以下功能:


1.可展开和折叠子项目


2.可通过单击来选中和选择多个项目


3.可通过拖放来重新排列和移动项目


4.可通过自定义代理来定制显示元素


5.支持所选项目的键盘导航


6.可通过过滤器来筛选显示项目


7.支持水平和垂直滚动


QTreeView的使用非常灵活,可以与任何数据模型一起使用,只需将QAbstractItemModel代理到QTreeView中即可。根据数据模型的不同,QTreeView可以轻松地显示各种树形结构数据,例如XML文档、SQLite数据库或JSON文件。


案例分析:


mainwindow.h

#ifndef MAINWINDOW_H
#define MAINWINDOW_H
 
#include <QMainWindow>
 
#include <QStandardItemModel>
 
QT_BEGIN_NAMESPACE
namespace Ui { class MainWindow; }
QT_END_NAMESPACE
 
class MainWindow : public QMainWindow
{
    Q_OBJECT
 
public:
    MainWindow(QWidget *parent = nullptr);
    ~MainWindow();
 
private:
    Ui::MainWindow *ui;
 
public:
    void InitTreeViewFunc();
    QStandardItemModel *sItemMode,*mModel;
};
#endif // MAINWINDOW_H

main.cpp

#include "mainwindow.h"
 
#include <QApplication>
 
int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    MainWindow w;
    w.show();
    return a.exec();
}

mainwindow.cpp

#include "mainwindow.h"
#include "ui_mainwindow.h"
 
MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
    , ui(new Ui::MainWindow)
{
    ui->setupUi(this);
 
    InitTreeViewFunc(); // 在构造函数调用树视图控件
}
 
MainWindow::~MainWindow()
{
    delete ui;
}
 
void MainWindow::InitTreeViewFunc() // 初始化树视图控件
{
    // 1:构造model
    sItemMode = new QStandardItemModel(ui->treeView);
    sItemMode->setHorizontalHeaderLabels(QStringList()<<QStringLiteral("编号") << QStringLiteral("初中部|高中部"));     //设置列头
 
    // 创建一级节点,将它加入到sItemModel
    QList<QStandardItem*> item11;
    QStandardItem *item1=new QStandardItem(QString::number(1));
    QStandardItem *item2=new QStandardItem("初中部");
    item11.append(item1);
    item11.append(item2);
    sItemMode->appendRow(item11);
 
    // 二级节点,添加到第一个一级节点
    QList<QStandardItem*> item112;
    QStandardItem *item1121=new QStandardItem(QString::number(2));
    QStandardItem *item1122=new QStandardItem(QStringLiteral("一年级"));
 
    item112.append(item1121);
    item112.append(item1122);
    item1->appendRow(item112);
 
    // 三级节点,添加到第一个二级节点
    QList<QStandardItem*> item1231;
    QStandardItem *item12311=new QStandardItem(QString::number(3));
    QStandardItem *item12312=new QStandardItem(QStringLiteral("一班"));
    item1231.append(item12311);
    item1231.append(item12312);
    item1121->appendRow(item1231);
 
    QList<QStandardItem*> item1232;
    QStandardItem *item12321=new QStandardItem(QString::number(3));
    QStandardItem *item12322=new QStandardItem(QStringLiteral("二班"));
    item1232.append(item12321);
    item1232.append(item12322);
    item1121->appendRow(item1232);
 
    QList<QStandardItem*> item1233;
    QStandardItem *item12331=new QStandardItem(QString::number(3));
    QStandardItem *item12332=new QStandardItem(QStringLiteral("三班"));
    item1233.append(item12331);
    item1233.append(item12332);
    item1121->appendRow(item1233);
 
    // 创建一级节点,将它加入到sItemModel
    QList<QStandardItem*> item12;
 
    QStandardItem *item3=new QStandardItem(QString::number(2));
    QStandardItem *item4=new QStandardItem("高中部");
 
    item12.append(item3);
    item12.append(item4);
    sItemMode->appendRow(item12);
 
    // 2:给QTreeView应用model
    ui->treeView->setModel(sItemMode);
 
}

编译执行结果:

3.QTableView

QTableView是Qt框架中的一个类,用于展示和编辑表格数据。它提供了一个表格视图,在其中可以显示由数据模型提供的表格数据。它还提供了诸如排序、编辑、选择、拖放等功能。


QTableView可以使用任何继承自QAbstractItemModel的模型类提供数据。模型将提供行和列数据,QTableView控件将使用这些数据在表格中显示。


QTableView还支持自定义单元格内容和样式,可以根据需要设置单元格的背景颜色、前景颜色、字体等。


案例分析:


mainwindow.h

#ifndef MAINWINDOW_H
#define MAINWINDOW_H
 
#include <QMainWindow>
 
 
QT_BEGIN_NAMESPACE
namespace Ui { class MainWindow; }
QT_END_NAMESPACE
 
class MainWindow : public QMainWindow
{
    Q_OBJECT
 
public:
    MainWindow(QWidget *parent = nullptr);
    ~MainWindow();
 
private:
    Ui::MainWindow *ui;
 
public:
    void InitTableViewFunc();
 
};
#endif // MAINWINDOW_H

main.cpp

#include "mainwindow.h"
 
#include <QApplication>
 
int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    MainWindow w;
    w.show();
    return a.exec();
}

mainwindow.cpp

#include "mainwindow.h"
#include "ui_mainwindow.h"
 
#include <QStandardItemModel>
 
MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
    , ui(new Ui::MainWindow)
{
    ui->setupUi(this);
 
    InitTableViewFunc(); // 调用自定义函数
}
 
MainWindow::~MainWindow()
{
    delete ui;
}
 
void MainWindow::InitTableViewFunc()
{
    // 1:添加表头,准备数据模型
    QStandardItemModel *stuMode = new QStandardItemModel();
    stuMode->setHorizontalHeaderItem(0,new QStandardItem(QObject::tr("学号")));
    stuMode->setHorizontalHeaderItem(1,new QStandardItem(QObject::tr("姓名")));
    stuMode->setHorizontalHeaderItem(2,new QStandardItem(QObject::tr("性别")));
    stuMode->setHorizontalHeaderItem(3,new QStandardItem(QObject::tr("分数")));
 
    // 通过API函数将数据模型绑定到QTableView
    ui->tableView->setModel(stuMode);
 
    // 设备表格列的宽度
    ui->tableView->setColumnWidth(0,120);
 
    // 2:添加数据信息
    stuMode->setItem(0,0,new QStandardItem("666"));
    stuMode->setItem(0,1,new QStandardItem("罗师傅"));
    stuMode->setItem(0,2,new QStandardItem("男"));
    stuMode->setItem(0,3,new QStandardItem("520"));
 
    stuMode->setItem(1,0,new QStandardItem("777"));
    stuMode->setItem(1,1,new QStandardItem("李黑鬼"));
    stuMode->setItem(1,2,new QStandardItem("女"));
    stuMode->setItem(1,3,new QStandardItem("530"));
 
    stuMode->setItem(2,0,new QStandardItem("888"));
    stuMode->setItem(2,1,new QStandardItem("周阿川"));
    stuMode->setItem(2,2,new QStandardItem("男"));
    stuMode->setItem(2,3,new QStandardItem("540"));
 
    stuMode->setItem(3,0,new QStandardItem("999"));
    stuMode->setItem(3,1,new QStandardItem("洪炯江鸟"));
    stuMode->setItem(3,2,new QStandardItem("男"));
    stuMode->setItem(3,3,new QStandardItem("550"));
 
    // 设置禁止编辑
    ui->tableView->setEditTriggers(QAbstractItemView::NoEditTriggers);
 
    stuMode->sort(3,Qt::DescendingOrder); // 设置降序排列
 
}

编译执行结果:


QT 项目视图(QListView&QTreeView&QTableView)和项目部件(QListWidget&QTreeWidget&QTableWidget)详解-2

https://developer.aliyun.com/article/1507903

相关文章
|
6月前
|
监控 数据可视化 Linux
Qt Model&View&Delegate(模型-视图-代理) 介绍和使用
Qt Model&View&Delegate(模型-视图-代理) 介绍和使用
Qt Model&View&Delegate(模型-视图-代理) 介绍和使用
|
6月前
|
数据库 开发者 Windows
QT 项目视图(QListView&QTreeView&QTableView)和项目部件(QListWidget&QTreeWidget&QTableWidget)详解-2
QT 项目视图(QListView&QTreeView&QTableView)和项目部件(QListWidget&QTreeWidget&QTableWidget)详解
|
6月前
|
索引
【qt】初识模型和视图2
【qt】初识模型和视图
25 0
|
6月前
|
数据库 索引
【qt】初识模型和视图1
【qt】初识模型和视图
30 0
|
6月前
【qt】QTableWidget 表格组件3
【qt】QTableWidget 表格组件
69 0
|
6月前
【qt】QTableWidget 表格组件2
【qt】QTableWidget 表格组件
66 0
|
6月前
【qt】QTableWidget 表格组件1
【qt】QTableWidget 表格组件
48 0
|
6月前
|
索引 Windows
【qt】QTreeWidget 树形组件2
【qt】QTreeWidget 树形组件
53 0
|
6月前
|
C++
【qt】QTreeWidget 树形组件1
【qt】QTreeWidget 树形组件
61 0
|
4月前
|
数据安全/隐私保护 C++ 计算机视觉
Qt(C++)开发一款图片防盗用水印制作小工具
文本水印是一种常用的防盗用手段,可以将文本信息嵌入到图片、视频等文件中,用于识别和证明文件的版权归属。在数字化和网络化的时代,大量的原创作品容易被不法分子盗用或侵犯版权,因此加入文本水印成为了保护原创作品和维护知识产权的必要手段。 通常情况下,文本水印可以包含版权声明、制作者姓名、日期、网址等信息,以帮助识别文件的来源和版权归属。同时,为了增强防盗用效果,文本水印通常会采用字体、颜色、角度等多种组合方式,使得水印难以被删除或篡改,有效地降低了盗用意愿和风险。 开发人员可以使用图像处理技术和编程语言实现文本水印的功能,例如使用Qt的QPainter类进行文本绘制操作,将文本信息嵌入到图片中,
180 1
Qt(C++)开发一款图片防盗用水印制作小工具