QT开发(八)——QT单元视图组件
QT中有四种单元视图组件,分别为列表视图QListView、树形视图QTreeView、表格视图QTableView、列视图QColumnView。
一、QListView列表视图
1、QListView组件简介
QListView列表视图,继承自QAbstractItemView。QListView是基于模型的列表/图标视图,不显示表头和表框,为Qt的模型/视图结构提供了更灵活的方式。
2、QListView组件属性
QListView组件属性设置:
A、name:组件对应源代码中的名称。
B、font:设置视图内字体。
C、batchSize:如果将layoutMode设置为Batched,则这个属性保存批量处理的规格。
D、layoutModel:项目的布局模式。
E、modeColumn:模型中可见的类,默认情况下,置为0,表述模型中第一列可见。
F、viewModel:保存ListView组件的视图模型。
3、QListView组件常用成员函数
QListView::QListView(QWidget *parent = 0)
构造一个父对象为parent的ListView。
void QListView::currentChanged(const QModelIndex ¤t,const QModelIndex &previous)[virtual protected]
把current定位当前项目,previous是以前的项目。
void QListView::dataChanged(const QModelIndex &topLeft,const QModelIndex &bottomRight)[virtual protected]
更改模型中项目topLeft到bottomRight。
QModelIndex QListView::indexAt(const QPoint &p)const [virtual]
返回坐标点p处项目的模型索引。
void QListView::rowsInserted(const QModelIndex &parent,int start,int end)[virtual protected]
插入新行,新行的父母是parent,从start到end的所有项目。
QModelIndexList QListView::selectedIndexes()const[virtual protected]
返回所有选中的非隐藏的项目的模型索引。
void setViewMode ( ViewMode mode )
设置显示模式,分为QListView::ListMode,QListView::IconMode,默认ListMode
void setLayoutMode ( LayoutMode mode )
设置布局模式,QListView::SinglePass,QListView::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树形视图
1、QTreeView组件简介
QTreeView树形视图,继承自QAbstractItemView,是基于模型的列表/图标视图,也是Qt模型/视图框架的一部分。
2、QTreeView组件属性
QTreeView组件属性设置选项:
A、name:组件对应源代码中的名称。
B、font:设置组件内所有文本的字体。
C、sortingEnable:项目是否排序。
3、QTreeView组件常用成员函数
QTreeView::QTreeView(QWidget *parent = 0)
构造一个父对象为parent的TreeView。
void QTreeView::collapse(const QModena &index)[slot]
折叠模型索引为index的项目
void QTreeView::collapseAll()[slot]
折叠所有项目
int QTreeView::columnAt(int x)const
返回x坐标处的列。
void QTreeView::columnCountChanged(int oldCount,int newCount)[protected slot]
通知树形视图中的列数,从oldCount改变到newCount。
void QTreeView::currentChanged(const QModelIndex ¤t,const QModelIndex &previous)[virtual protected]
把current定为当前项目,previous是以前的当前项目
void QTreeView::dataChanged(const QModelIndex &topLeft,const QModelIndex &bottomRight)[virtual]
更改模型中项目topLeft到bottomRight。
void QTreeView::drawBranches(QPainter *painter,const QRect &rect,const QModelIndex &index)const [virtual protected[
在项目index的同一行,用painter绘制指定的rect矩形分支。
void QTreeView::drawRow(QPainter *painter,const QStyleOptionViewItem &option,const QModelIndex &index)const [virtual protected]
用painter绘制新行,新行包含模型索引 为index的项目,option是如何显示项目。
void QTreeView::drawTree(QPainter *painter,const QRegion ion)const [protected]
用painter在区域region绘制树
void QTreeView::expand(const QModelIndex &index)[slot]
展开模型索引为index的项目。
void QTreeView::expandAll()[slot]
展开所有的项目
void QTreeView::expandToDepth(int depth) [slot]
展开树形视图中的项目,深度为depth
QHeaderView *QTreeView::header()const
返回该树形视图的header
QModelIndex QTreeView::indexAbove(const QModelIndex &index)const
返回模型索引index的上一个索引
QModelIndex QTreeView::indexAt(const QPoint &point)const [virtual]
返回点point处项目的模型索引
QModelIndex QTreeView::indexBelow(const QModelIndex &index)const
返回模型索引index的下一个索引
bool QTreeView::isExpanded(const QModelIndex &index)const
如果模型索引index处的项目是展开着的,返回true,否则返回false
void QTreeV::rowsInserted(const QModelIndex &parent,int start,int end)[virtual protected]
插入新行,新行的父母是parent,包括从start到end的所有项目。
void QTreeView::rowsRemoved(const QModelIndex &parent,int start,int end)[protected slot]
删除行,行的父母是parent,包括从start到end的所有项目
void QTreeView::selectAll()[virtual]
设置所有的项目都是选择状态
QModelIndexList QTreeView::selectedIndexes()const [virtual protected]
返回所有选中和非隐藏的项目的模型索引
void QTreeView::setHeader(QHeaderView *header)
设置该TreeView的标题为header
void QTreeView::sortByColumn(int column,QT::SortOrder order)
对列column按order进行排序
4、QTreeView实例
#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表格视图
1、QTableView组件简介
QTableView表格视图,是一个模型/视图结构的表视图实现,用来显示模型的项目。QTableView提供了QTable类提供的标准表格,是Qt的模型/视图框架的一部分,由QAbstractItemView类定义的接口来实现,使其能够显示由QAbstractItemModel类派生的模型提供的数据。QTableView可以使用自定义的数据模型来显示内容。
2、QTableView组件属性
QTableView组件属性设置选项:
A、name:该控件对应源代码中的名称
B、font:设置表格内部的字体
C、cornerButtonEnabled:左上角的按钮是否有用
D、gridStyle:表格的格式
E、showGrid:是否显示网格,值为true,显示,否则不显示
F、sortingEnabled:是否对项目排序
3、QTableView组件常用成员函数
QTableView::QTableView(QWidget *parent = 0)
构造一个父对象为parent的TableView
void QTableView::clearSpans()
删除TableView中的所有行和列的跨度
int QTableView::columnAt(int x)const
返回坐标x处的列,如果坐标处没有项目则返回-1
int QTableView::columnSpan(int row,intcolumn)const
返回行row、列column处的行跨度
void QTableView::currentChanged(const QModelIndex ¤t,const QModelIndex &previous)[virtual protected]
把current指定为当前项目,previous是以前的项目
QHeaderView *QTableView::horizontalHeader()const
返回TableView的水平标题
QModelIndex QTableView::indexAt(const QPoint *pos)const [virtual]
返回点pos处项目的模型索引
int QTableView::rowAt(int y)const
返回坐标y处的行,如果坐标处没有项目则返回-1
int QTableView::rowSpan(int row,int column)const
返回行row、列column处的列跨度
void QTableView::selectcolumn(int column)[slot]
设置列column为选中状态
void QTableView::selectRow(int row)[slot]
设置行row为选中状态
QModelIndexList QTableView::selectedIndexes()const [virtual protected]
返回所有选中和非隐藏的项目的模型索引
void QTableView::setHorizontalHeader(QHeaderView *header)
设置TableView的水平标题为header
void QTableView::setSpan(int row,int column,int rowSpanCount,int columnCount)
设置行row、列column处的行跨度为rowSpanCount、列跨度为columnSpanCount
void QTableView::setVerticalHeader(QHeaderView *header)
设置TableView的垂直标题为header
void QTableView::showColumn(int column)[slot]
显示列column
void QTableView::showRow(int 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列视图
1、QColumnView组件简介
QColumnView列视图提供了一个模型/视图的列视图实现,是模型/视图框架的一部分,提供了多级的视图(每点开一个选项都会在它旁边出现一个菜单,显示它所有的子项目)。
2、QColumnView组件属性
QColumnView组件属性设置选项:
A、name:组件对应源代码中的名字
B、font:设置表格内部的字体
3、QColumnView组件常用成员函数
QColumnView::QColumnView(QWidget *parent = 0)
构造一个父对象为parent的ColumnView
QAbstractItemView * QColumnView::createColumn(const QModelIndex *index)[virtual protected]
index是视图的根模型索引,返回新的视图
void QColumnView::currentChanged(const QModelIndex ¤t,const QModelIndex &previous)[virtual protected]
把current指定为当前项目,previous是以前的当前项目
QModelIndex QColumnView::indexAt(cosnt QPoint &point)const [virtual]
返回点pos处项目的索引模型
QWidget *QColumnView::previewWidget()const
返回预览组件,如果没有则返回0
void QColumnView::rowsInserted(const QModelIndex &parent,int start,int end)[virtual protected]
插入新行,新行的父母是parent包括从start到end的所有项目
void QColumnView::selectAll()[virtual]
设置该ColumnView中的所有项目为选中状态
void QColumnView::setPreviewWidget(QWidget *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(); }