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(); }