QTableView简单使用

简介: QTableView入门

QTableView入门

先来看一下QTableView介绍:(Qt 5.7.0)
The QTableView class provides a default model/view implementation of a table view.

A QTableView implements a table view that displays items from a model. This class is used to provide standard tables that were previously provided by the QTable class, but using the more flexible approach provided by Qt's model/view architecture.

The QTableView class is one of the Model/View Classes and is part of Qt's model/view framework.

QTableView implements the interfaces defined by the QAbstractItemView class to allow it to display data provided by models derived from the QAbstractItemModel class.

本人英语水平有限,就不作翻译了,以免误人子弟。从官方的介绍,可以得到以下信息:

QTableView是用来展示item的,item包含在model中。QTableView和model各司其职。
怎么理解这个呢,拿相框、相片、相册来说吧,相框用来展示相片,相片是从相册中取出来的。
为了使用QTableView,必须使用一个model,可以使用QStandardItemModel。

来一个栗子:

// 头文件
#ifndef MYWIDGET_H
#define MYWIDGET_H

#include <QWidget>
#include <QTableView>
#include <QStandardItemModel>

class MyWidget : public QWidget
{
    Q_OBJECT

public:
    MyWidget(QWidget *parent = 0);
    ~MyWidget();

private:
    QTableView * table_view;
    QStandardItemModel * item_model;
};

#endif // MYWIDGET_H
// 源文件
#include "mywidget.h"
#include <QStandardItem>

MyWidget::MyWidget(QWidget *parent)
    : QWidget(parent)
{
    table_view = new QTableView(this);
    item_model = new QStandardItemModel(4,4);  // 4行4列
    table_view->setModel(item_model);          // 关联view与model

    for (int i = 0; i < 4; ++i)
        for (int j = 0; j < 4; ++j)
            item_model->setItem(i, j, new QStandardItem(QString("%1").arg(i + j)));  // 向model中添加item
}

MyWidget::~MyWidget()
{

}

运行结果:
_
可以看到,model中的item,都在QTableView中展示出来了,但这界面,好像只能用两个字来形容了,好丑。

为了让QTableView铺满窗口,可以使用布局,此处选择QHBoxLayout。

MyWidget::MyWidget(QWidget *parent)
    : QWidget(parent)
{
    setFixedSize(600, 300);                           // 设置窗体大小
    QHBoxLayout * alayout = new QHBoxLayout(this);
    table_view = new QTableView;
    alayout->addWidget(table_view);
    item_model = new QStandardItemModel(4,4);
    table_view->setModel(item_model);

    for (int i = 0; i < 4; ++i)
        for (int j = 0; j < 4; ++j)
            item_model->setItem(i, j, new QStandardItem(QString("%1").arg(i + j)));
}

_
通过这张图,可以清晰的看到,QTableView包含下列内容:
_

可以看到,最后一列的右边,还有好大一片空白,看着好不别扭。为了能让最后一列一直伸展到最右边,可以使用水平表头的setStretchLastSection()函数。同时,也可以设置水平表头或垂直表头的标签内容,追加数据等操作。

MyWidget::MyWidget(QWidget *parent)
    : QWidget(parent)
{
    setFixedSize(600, 300);                                       // 设置窗体大小
    QHBoxLayout * alayout = new QHBoxLayout(this);
    table_view = new QTableView;
    alayout->addWidget(table_view);

    item_model = new QStandardItemModel(4,4);
    table_view->setModel(item_model);

//    table_view->horizontalHeader()->hide();                       // 隐藏水平表头
//    table_view->verticalHeader()->hide();                         // 隐藏垂直表头
    table_view->horizontalHeader()->setStretchLastSection(true);  // 伸缩最后一列

    QStringList column, row;
    column << "Column 1" << "Column 2" << "Column 3" << "Column 4";
    row << "row 1" << "row 2" << "row 3" << "row 4";
    item_model->setHorizontalHeaderLabels(column);                // 设置水平表头标签
    item_model->setVerticalHeaderLabels(row);                     // 设置垂直表头标签

    // 添加item到model
    for (int i = 0; i < 4; ++i)
        for (int j = 0; j < 4; ++j)
            item_model->setItem(i, j, new QStandardItem(QString("%1").arg(i + j)));


    item_model->appendRow(new QStandardItem("HELLO"));            // 追加行,此时仅第1列有数据

    QList<QStandardItem *> lsi;
    lsi.append(new QStandardItem("HELLO"));
    lsi.append(new QStandardItem("WORLD"));
    lsi.append(new QStandardItem("你好"));
    item_model->appendRow(lsi);                                   // 追加行,相应列均有数据,即前三列有数据

    table_view->setShowGrid(false);                               // 隐藏网格线
    table_view->setFocusPolicy(Qt::NoFocus);                      // 去除当前Cell周边虚线框
    table_view->setAlternatingRowColors(true);                    // 开启隔行异色
}

运行效果如下:
_

待续……

相关文章
|
8月前
|
图形学
|
5月前
|
数据安全/隐私保护 容器
[Qt5&控件] 控件stackedWidget、lineEdit等的用法
[Qt5&控件] 控件stackedWidget、lineEdit等的用法
44 0
[Qt5&控件] 控件stackedWidget、lineEdit等的用法
|
6月前
PyQt5-QLabel控件是什么?方法有哪些?具体如何使用?
PyQt5-QLabel控件是什么?方法有哪些?具体如何使用?
39 0
|
C语言
QT QtableView操作详解
本文实现了使用QtableView控件来显示数据,数据源使用txt文本作为数据源,使用了QStandardItemModel作为数据模型来实现了对TableView空间的初始化,和对txt数据源的增删改查功能。
396 0
QT QtableView操作详解
|
Android开发
侧滑菜单的简单使用
本节给大家带来基础UI控件部分的最后一个控件:DrawerLayout,官方给我们提供的一个侧滑菜单控件,和上一节的ViewPager一样,3.0以后引入,低版本使用它,需要v4兼容包,说到侧滑,相信很多人都用过github上的SlidingMenu,不过好像有两个版本,一个是单独的,另一个需要依赖另一个开源项目:ActionBarSherlock;既然Google为我们提供了这个控件,为何不用咧,而且在Material Design设计规范中,随处可见的很多侧滑菜单的动画效果,大都可以通过Toolbar +DrawerLayout来实现。
53 0
|
Web App开发 索引
Qt之QTableView显示富文本
简述 对于QTableView中的显示,我们前面介绍过很多种,其中包括:文本、进度条、复选框等,今天我们介绍一下关于富文本的显示。 可能绝大多数小伙伴会通过QAbstractTableModel中的data来实现,可是现实告诉我们,那是行不通的,那么我们如何去显示呢?请看正文。 简述 效果 源码 分析 效果 源码 下面我们使用QAbstrac
981 0
|
存储 程序员 C#
Python Qt GUI设计:QTableView、QListView、QListWidet、QTableWidget、QTreeWidget和QTreeWidgetltem表格和树类(提升篇—1)
Python Qt GUI设计:QTableView、QListView、QListWidet、QTableWidget、QTreeWidget和QTreeWidgetltem表格和树类(提升篇—1)
Python Qt GUI设计:QTableView、QListView、QListWidet、QTableWidget、QTreeWidget和QTreeWidgetltem表格和树类(提升篇—1)
|
开发工具 C语言 索引
Qt编写自定义控件25-自定义QCustomPlot
一、前言 上次在写大屏数据可视化电子看板系统时候,提到过改造QCustomPlot来实现柱状分组图、横向柱状图、横向分组图、鼠标悬停提示等。这次单独列出来描述,有很多人疑问为啥不用QChart,或者echart等形式,其实这两种方式我都尝试过,比如Qt5.7以后新增的QChart模块,曲线这块,支持数据量很小,而且用法极其不适应,非常别扭,尤其是10W以上数据量的支持,简直是渣渣,优点也是有很多的,比如动画效果,我看过他的完整源码,动画这块处理的非常好,连坐标轴都可以有动画效果,而且支持很多种效果,而且内置了很多套theme皮肤,省去了很多渣渣审美的程序员自己来配色,这个倒是挺方便的。
1201 0
|
XML Android开发 数据格式
Toolbar的简单使用
Toolbar(android.support.v7.widget.Toolbar)是Android5.0之后出现的用来取代ActionBar的一个控件。
1259 0