QT开发(八)——QT单元视图组件

    QT中有四种单元视图组件,分别为列表视图QListView、树形视图QTreeView、表格视图QTableView、列视图QColumnView

一、QListView列表视图

1QListView组件简介

    QListView列表视图,继承自QAbstractItemView。QListView是基于模型的列表/图标视图,不显示表头和表框,为Qt的模型/视图结构提供了更灵活的方式。

2QListView组件属性

    QListView组件属性设置:

    A、name:组件对应源代码中的名称。

    B、font:设置视图内字体。

 C、batchSize:如果将layoutMode设置为Batched,则这个属性保存批量处理的规格。

    D、layoutModel:项目的布局模式。

    E、modeColumn:模型中可见的类,默认情况下,置为0,表述模型中第一列可见。

    F、viewModel:保存ListView组件的视图模型。

3QListView组件常用成员函数

QListView::QListViewQWidget *parent = 0

构造一个父对象为parent的ListView。

void QListView::currentChangedconst QModelIndex ¤tconst QModelIndex &previous[virtual protected]

current定位当前项目,previous是以前的项目。

void QListView::dataChangedconst QModelIndex &topLeftconst QModelIndex &bottomRight[virtual protected]

更改模型中项目topLeft到bottomRight。

QModelIndex QListView::indexAtconst QPoint &pconst [virtual]

返回坐标点p处项目的模型索引。

void QListView::rowsInsertedconst QModelIndex &parentint startint end[virtual protected]

插入新行,新行的父母是parent,从start到end的所有项目。

QModelIndexList QListView::selectedIndexes()const[virtual protected]

返回所有选中的非隐藏的项目的模型索引。

void setViewMode ( ViewMode mode )

设置显示模式,分为QListView::ListModeQListView::IconMode默认ListMode

void setLayoutMode ( LayoutMode mode )

设置布局模式,QListView::SinglePassQListView::Batched

virtual void QAbstractItemView::setModel(QAbstractItemModel * model)

设置view所关联的model

4、QListView实例

Widget.h文件:

#ifndef WIDGET_H
#define WIDGET_H
#include 
#include 
#include 
#include 
#include 
#include 
class Widget : public QWidget
{
    Q_OBJECT
    
public:
    Widget(const QStringList &leaders, QWidget *parent = 0);
    ~Widget();
private:
    QStringListModel *model;
    QListView *listView;
    QDialogButtonBox *buttonBox;
private slots:
    void onDelete();
    void onInsert();
};
#endif // WIDGET_H

Widget.cpp文件:

#include "widget.h"
Widget::Widget(const QStringList &leaders, QWidget *parent)
    : QWidget(parent)
{
    model = new QStringListModel(this);
    model->setStringList(leaders);
    listView = new QListView;
    listView->setModel(model);
    listView->setEditTriggers(QAbstractItemView::AnyKeyPressed
                              | QAbstractItemView::DoubleClicked);
    buttonBox = new QDialogButtonBox;
    QPushButton *insertButton = buttonBox->addButton(
                tr("&Insert"),QDialogButtonBox::ActionRole);
    QPushButton *deleteButton = buttonBox->addButton(
                tr("&Delete"), QDialogButtonBox::ActionRole);
    connect(insertButton, SIGNAL(clicked()), this, SLOT(onInsert()));
    connect(deleteButton, SIGNAL(clicked()), this, SLOT(onDelete()));
    QVBoxLayout *layout = new QVBoxLayout;
    layout->addWidget(listView);
    layout->addWidget(buttonBox);
    setLayout(layout);
    setWindowTitle(tr("QStringListModel"));
}
Widget::~Widget()
{
}
void Widget::onDelete()
{
    model->removeRows(listView->currentIndex().row(), 1);
}
void Widget::onInsert()
{
    int row = listView->currentIndex().row();
    model->insertRows(row, 1);
    QModelIndex index = model->index(row);
    listView->setCurrentIndex(index);
    listView->edit(index);
}

Main.cpp文件:

#include 
#include "widget.h"
int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    QStringList list;
    list << QObject::tr("xianziyu")
         << QObject::tr("yangwangming")
         << QObject::tr("yinshixin")
         << QObject::tr("baichengshuang")
         << QObject::tr("zhangzurui");
    Widget w(list);
    w.show();
    
    return a.exec();
}


二、QTreeView树形视图

1QTreeView组件简介

    QTreeView树形视图,继承自QAbstractItemView,是基于模型的列表/图标视图,也是Qt模型/视图框架的一部分。

2QTreeView组件属性

    QTreeView组件属性设置选项:

    A、name:组件对应源代码中的名称。

    B、font:设置组件内所有文本的字体。

    C、sortingEnable:项目是否排序。

3QTreeView组件常用成员函数

QTreeView::QTreeViewQWidget *parent = 0

构造一个父对象为parent的TreeView。

void QTreeView::collapseconst QModena &index[slot]

折叠模型索引为index的项目

void QTreeView::collapseAll()[slot]

折叠所有项目

int QTreeView::columnAtint xconst

返回x坐标处的列。

void QTreeView::columnCountChangedint oldCountint newCount[protected slot]

通知树形视图中的列数,从oldCount改变到newCount。

void QTreeView::currentChangedconst QModelIndex ¤tconst QModelIndex &previous[virtual protected]

current定为当前项目,previous是以前的当前项目

void QTreeView::dataChangedconst QModelIndex &topLeftconst QModelIndex &bottomRight[virtual]

更改模型中项目topLeft到bottomRight。

void QTreeView::drawBranchesQPainter *painterconst QRect &rectconst QModelIndex &indexconst [virtual protected[

在项目index的同一行,用painter绘制指定的rect矩形分支。

void QTreeView::drawRowQPainter *painterconst QStyleOptionViewItem &optionconst QModelIndex &indexconst [virtual protected]

painter绘制新行,新行包含模型索引 为index的项目,option是如何显示项目。

void QTreeView::drawTreeQPainter *painterconst QRegion ionconst [protected]

painter在区域region绘制树

void QTreeView::expandconst QModelIndex &index[slot]

展开模型索引为index的项目。

void QTreeView::expandAll()[slot]

展开所有的项目

void QTreeView::expandToDepth(int depth) [slot]

展开树形视图中的项目,深度为depth

QHeaderView *QTreeView::header()const

返回该树形视图的header

QModelIndex QTreeView::indexAboveconst QModelIndex &indexconst

返回模型索引index的上一个索引

 QModelIndex QTreeView::indexAtconst QPoint &pointconst [virtual]

返回点point处项目的模型索引

QModelIndex QTreeView::indexBelowconst QModelIndex &indexconst

返回模型索引index的下一个索引

bool QTreeView::isExpandedconst QModelIndex &indexconst

如果模型索引index处的项目是展开着的,返回true,否则返回false

void QTreeV::rowsInsertedconst QModelIndex &parentint startint end[virtual protected]

插入新行,新行的父母是parent,包括从start到end的所有项目。

void QTreeView::rowsRemovedconst QModelIndex &parentint startint end[protected slot]

删除行,行的父母是parent,包括从start到end的所有项目

void QTreeView::selectAll()[virtual]

设置所有的项目都是选择状态

QModelIndexList QTreeView::selectedIndexes()const [virtual protected]

返回所有选中和非隐藏的项目的模型索引

void QTreeView::setHeaderQHeaderView *header

设置该TreeView的标题为header

void QTreeView::sortByColumnint columnQT::SortOrder order

对列column按order进行排序

4QTreeView实例

#include 
#include 
#include 
#include 
int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    QSplitter *splitter = new QSplitter;
    QDirModel *model = new QDirModel;
    //从缺省目录创建数据
    QTreeView *tree = new QTreeView(splitter);
    tree->setModel(model);
    tree->setRootIndex(model->index("d:\\"));
    QTextCodec::setCodecForTr(QTextCodec::codecForName("GBK"));   //中文显示
    QTextCodec *codec = QTextCodec::codecForLocale();
    QString s = codec->toUnicode("目录");
    splitter->setWindowTitle(s);
    splitter->show();
    
    return a.exec();
}

三、QTableView表格视图

1QTableView组件简介

    QTableView表格视图,是一个模型/视图结构的表视图实现,用来显示模型的项目。QTableView提供了QTable类提供的标准表格,是Qt的模型/视图框架的一部分,由QAbstractItemView类定义的接口来实现,使其能够显示由QAbstractItemModel类派生的模型提供的数据。QTableView可以使用自定义的数据模型来显示内容

2QTableView组件属性

    QTableView组件属性设置选项:

    A、name:该控件对应源代码中的名称

    B、font:设置表格内部的字体

    C、cornerButtonEnabled:左上角的按钮是否有用

    D、gridStyle:表格的格式

    E、showGrid:是否显示网格,值为true,显示,否则不显示

    F、sortingEnabled:是否对项目排序

3QTableView组件常用成员函数

QTableView::QTableViewQWidget *parent = 0

构造一个父对象为parent的TableView

 void QTableView::clearSpans()

删除TableView中的所有行和列的跨度

 int QTableView::columnAtint xconst

返回坐标x处的列,如果坐标处没有项目则返回-1

 int QTableView::columnSpanint rowintcolumnconst

返回行row、列column处的行跨度

void QTableView::currentChangedconst QModelIndex ¤tconst QModelIndex &previous[virtual protected]

current指定为当前项目,previous是以前的项目

QHeaderView *QTableView::horizontalHeader()const

返回TableView的水平标题

QModelIndex QTableView::indexAtconst QPoint *posconst [virtual]

返回点pos处项目的模型索引

int QTableView::rowAtint yconst

返回坐标y处的行,如果坐标处没有项目则返回-1

 int QTableView::rowSpanint rowint columnconst

返回行row、列column处的列跨度

void QTableView::selectcolumnint column[slot]

设置列column为选中状态

void QTableView::selectRowint row[slot]

设置行row为选中状态

QModelIndexList QTableView::selectedIndexes()const [virtual protected]

返回所有选中和非隐藏的项目的模型索引

void QTableView::setHorizontalHeaderQHeaderView *header

设置TableView的水平标题为header

void QTableView::setSpanint rowint columnint rowSpanCountint columnCount

设置行row、列column处的行跨度为rowSpanCount、列跨度为columnSpanCount

void QTableView::setVerticalHeaderQHeaderView *header

设置TableView的垂直标题为header

void QTableView::showColumnint column[slot]

显示列column

void QTableView::showRowint row[slot]

显示行row

QHeaderView *QTableView::verticalHeader()const

返回TableView的垂直标题

4、QTableView实例

#include 
#include 
#include 
#include 
int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    QStandardItemModel *model = new QStandardItemModel();
    model->setColumnCount(2);
    model->setHeaderData(0,Qt::Horizontal,QString::fromLocal8Bit("卡号"));
    model->setHeaderData(1,Qt::Horizontal,QString::fromLocal8Bit("姓名"));
    QTableView *tableview = new QTableView();
    tableview->setModel(model);
    tableview->horizontalHeader()->setDefaultAlignment(Qt::AlignLeft);
    tableview->horizontalHeader()->setResizeMode(0,QHeaderView::Fixed);
    tableview->horizontalHeader()->setResizeMode(1,QHeaderView::Fixed);
    tableview->setColumnWidth(0, 100);
    tableview->setColumnWidth(1, 100);
    for(int i = 0; i < 100; i++)
     {
         model->setItem(i,0,new QStandardItem("220161101"));
            //设置字符颜色
         model->item(i,0)->setForeground(QBrush(QColor(255, 0, 0)));
            //设置字符位置
         model->item(i,0)->setTextAlignment(Qt::AlignCenter);
         model->setItem(i,1,new QStandardItem(QString::fromLocal8Bit("哈哈")));
     }
    tableview->show();
    return a.exec();
}

四、QColumnView列视图

1QColumnView组件简介

    QColumnView列视图提供了一个模型/视图的列视图实现,是模型/视图框架的一部分,提供了多级的视图(每点开一个选项都会在它旁边出现一个菜单,显示它所有的子项目)。

2QColumnView组件属性

    QColumnView组件属性设置选项:

    A、name:组件对应源代码中的名字

    B、font:设置表格内部的字体

3QColumnView组件常用成员函数

QColumnView::QColumnViewQWidget *parent = 0

构造一个父对象为parent的ColumnView

QAbstractItemView * QColumnView::createColumnconst QModelIndex *index[virtual protected]

index是视图的根模型索引,返回新的视图

void QColumnView::currentChangedconst QModelIndex ¤tconst QModelIndex &previous[virtual protected]

current指定为当前项目,previous是以前的当前项目

QModelIndex QColumnView::indexAtcosnt QPoint &pointconst [virtual]

返回点pos处项目的索引模型

QWidget *QColumnView::previewWidget()const

返回预览组件,如果没有则返回0

void QColumnView::rowsInsertedconst QModelIndex &parentint startint end[virtual protected]

插入新行,新行的父母是parent包括从start到end的所有项目

void QColumnView::selectAll()[virtual]

设置该ColumnView中的所有项目为选中状态

void QColumnView::setPreviewWidgetQWidget *widget

设置widget为该columnView的预览组件。

4、QColumnView实例

#include 
#include 
#include 
#include 
#include 
int main(int argc, char *argv[])
{
    QApplication app(argc, argv);
    QMainWindow win;
    QColumnView *cview = new QColumnView(&win);
    win.setCentralWidget(cview);
    QStandardItemModel model;
    for (int groupnum = 0; groupnum < 3 ; ++groupnum)
    {
        QStandardItem *group = new QStandardItem(QString("Group %1").arg(groupnum));
        for (int personnum = 0; personnum < 5 ; ++personnum)
        {
            QStandardItem *child = new QStandardItem(QString("Person %1 (group %2)").arg(personnum).arg(groupnum));
            group->appendRow(child);
        }
        model.appendRow(group);
    }
    cview->setModel(&model);
    win.show();
    return app.exec();
}