QTableView view(this); QStandardItemModel model(this); /*设置表头水平标题*/ model.setHorizontalHeaderItem(0,new QStandardItem("Name")); model.setHorizontalHeaderItem(1,new QStandardItem("Sex")); model.setHorizontalHeaderItem(2,new QStandardItem("Age")); model.horizontalHeaderItem(0)->setFont(QFont("Helvetica",20,50)); //设置标题字体 /*设置表头垂直标题*/ model.setVerticalHeaderItem(0,new QStandardItem("No.1")); model.setVerticalHeaderItem(1,new QStandardItem("No.2")); model.setVerticalHeaderItem(2,new QStandardItem("No.3")); /*设置列表条目数据*/ QPixmap pix(":user.png"); pix = pix.scaled(24,24,Qt::KeepAspectRatio); QStandardItem *itemA=new QStandardItem(); itemA->setData(pix,Qt::DecorationRole); //设置条目图标 itemA->setData("A",Qt::DisplayRole); itemA->setData("A:tooltip",Qt::ToolTipRole); itemA->setData(QFont("宋体",12,QFont::Bold,true),Qt::FontRole); //设置条目字体 itemA->setData(Qt::AlignCenter,Qt::TextAlignmentRole); //设置条目中心对齐
//能够实现按数值排序,不然的话"2">"123"
itemA->setData(Qt::DisplayRole, 2);
QLinearGradient linearGradient(0,0,100,20); linearGradient.setColorAt(0.2, Qt::white); linearGradient.setColorAt(0.6, Qt::green); linearGradient.setColorAt(1.0, Qt::black); itemA->setData(QBrush(linearGradient),Qt::BackgroundRole); //设置条目背景色(为渐变色) model.setItem(0,0,itemA); model.setItem(0,1,new QStandardItem("B")); model.setItem(1,0,new QStandardItem("C")); model.item(0,1)->setTextAlignment(Qt::AlignCenter); //设置条目居中对齐 /*将数据模型的第一列进行降低排序(从大到小,不会进行整行排序)*/ model.sort(0,Qt::DescendingOrder);
/*根据视图里的第一列数据,进行整行大小排序*/ html
view.sortByColumn(0);web
/*设置视图可以自动使能排序*/ide
view.setSortingEnabled(true);
/*设置视图是否支持自动滑动*/函数
view.setAutoScroll(bool enable);工具
/*设置选中一行后,标题的字体不会加粗*/字体
view->horizontalHeader()->setHighlightSections(false);
/*设置列宽不可变更,在5.X后改成了setSectionResizeMode()*/ view.horizontalHeader()->setResizeMode(QHeaderView::Fixed); /*设置行宽不可变更*/ view.verticalHeader()->setResizeMode(QHeaderView::Fixed);
/*设置用户选择模式, NoSelection表示不能选择表格*/ui
view.setSelectionMode(QAbstractItemView::NoSelection);this
/*隐藏垂直标题*/spa
view.verticalHeader()->hide();code
/*设置用户选择时,只能选中一行*/
view.setSelectionMode(QAbstractItemView::SingleSelection);
//设置选择模式,表示只能选中单个
view.setSelectionBehavior(QAbstractItemView::SelectRows);
//设置选择行为,表示只能选择一行(也能够设置为列,或者单个Item项目)
/*设置表格不可编辑*/ view.setEditTriggers(QAbstractItemView::NoEditTriggers);
/*设置表头的显示与隐藏*/ view.horizontalHeader()->setVisible(false); view.verticalHeader()->setVisible(false); /*禁止显示网格线*/ view.setShowGrid(false); /*禁止显示滚动条*/ view.setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff); /*设置行列的高宽*/ view.setColumnWidth(0,50); //设置column0(第1列)的宽度为50,必需要设置好model后,再来设置宽度 view.setRowHeight(0,30); //设置row0(第1行)的高度为30,必须setModel()后,再来设置高度 view.resizeRowsToContents(); //更据当前内容自动调整行距 view.resizeColumnsToContents(); //更据当前内容自动调整列距
/*禁止焦点(取消QTableView选中后的虚线框)*/
view.setFocusPolicy(Qt::NoFocus);
/*获取鼠标当前位于视图的哪一个index位置*/
qDebug()<<view.currentIndex().row(); //获取行号,若是为-1,表示无效
qDebug()<<view.currentIndex().column();//获取列号,若是为-1,表示无效
对于QStandardItem的setData()成员 函数的第二个参数role 是模型数据角色
当role值不一样时,则显示在视图上的方式也会不一样
对于role角色,经常使用的值有:
实现右击菜单
当用户在QTableView视图里右击鼠标时,便会触发一个QEvent::ContextMenu类型的事件,因此经过事件过滤器来实现右击菜单效果
步骤:
效果:
代码以下
Widget.h:
#ifndef WIDGET_H #define WIDGET_H #include <QtGui> class Widget : public QWidget { Q_OBJECT QTableView view; QStandardItemModel model; QMenu menu; public: explicit Widget(QWidget *parent = 0); bool eventFilter(QObject* obj, QEvent *evt); public slots: void onDelete(void); }; #endif // WIDGET_H
Widget.cpp:
#include "widget.h" Widget::Widget(QWidget *parent) : QWidget(parent), view(this), model(this), menu(this) { model.setItem(0,0, new QStandardItem("A")); model.setItem(0,1, new QStandardItem("B")); model.setItem(1,0, new QStandardItem("C")); model.setItem(1,1, new QStandardItem("D")); model.setItem(2,0, new QStandardItem("E")); model.setItem(2,1, new QStandardItem("F")); model.setItem(3,0, new QStandardItem("G")); model.setItem(3,1, new QStandardItem("H")); /*设置视图只能选中一行,取消焦点,禁止编辑*/ view.setFocusPolicy(Qt::NoFocus); view.setEditTriggers(QAbstractItemView::NoEditTriggers); view.setSelectionMode(QAbstractItemView::SingleSelection); view.setSelectionBehavior(QAbstractItemView::SelectRows); view.setModel(&model); view.installEventFilter(this); menu.addAction("删除",this,SLOT(onDelete())); //设置菜单项,并链接槽函数 } void Widget::onDelete(void) { model.removeRow(view.currentIndex().row()); //更据当前鼠标所在的索引的行位置,删除一行 } bool Widget::eventFilter(QObject* obj, QEvent *evt) { if(obj == &view && evt->type() == QEvent::ContextMenu) { if(view.currentIndex().isValid()==true) {
menu.exec(cursor().pos()); //在当前鼠标位置上运行菜单menu对象 } } return QWidget::eventFilter(obj,evt); }
main函数:
int main(int argc, char *argv[]) { QApplication a(argc, argv); Widget w; w.show(); return a.exec(); }