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);
/*根據視圖里的第一列數據,進行整行大小排序*/
view.sortByColumn(0);
/*設置視圖能夠自動使能排序*/
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表示不能選擇表格*/
view.setSelectionMode(QAbstractItemView::NoSelection);
/*隱藏垂直標題*/
view.verticalHeader()->hide();
/*設置用戶選擇時,只能選中一行*/
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,表示無效
void QTableView::setSpan(int row, int column, int rowSpanCount, int columnSpanCount);
//合並單元格
//第一個參數:要改變的單元格行數
//第二個參數:要改變的單元格列數
//第三個參數:需要合並的行數
//第四個參數:需要合並的列數
//比如: setSpan(0,0,2,3); 表示從table(0,0)開始到2,3結束,合並共2行和3列
合並單元格提醒
數據更新后,還要繼續使用setSpan再次合並(主要是要對全表格進行重新的單元格合並,已經合並過的地方行列又要重新進行新的合並,因為數據已經更新),這時不能直接使用setSpan,而是要先把QTableView的row還原為原來沒有合並行列的情形,再次使用setSpan
對於QStandardItem的setData()成員 函數的第二個參數role 是模型數據角色
當role值不同時,則顯示在視圖上的方式也會不同
對於role角色,常用的值有:
- Qt::DisplayRole 0 以文本方式顯示數據(QString)
- Qt::DecorationRole 1 將數據作為圖標來裝飾(QIcon,QPixmap)
- Qt::EditRole 2 可編輯的數據信息顯示(QString)
- Qt::ToolTipRole 3 作為工具提示顯示(QString)
- Qt::StatusTipRole 4 作為狀態欄中顯示的數據(QString)
- Qt::WhatsThisRole 5 作為幫助信息欄中顯示的數據(QString)
- Qt::FontRole 6 設置字體(QFont)
- Qt::TextAlignmentRole 7 設置模型數據的文本對齊(Qt::AlignmentFlag)
- Qt::BackgroundRole 8 設置模型數據的背景色(QBrush)
- Qt::ForegroundRole 9 設置模型數據的前景色,比如字體(QBrush)
實現右擊菜單
當用戶在QTableView視圖里右擊鼠標時,便會觸發一個QEvent::ContextMenu類型的事件,所以通過事件過濾器來實現右擊菜單效果
步驟:
- 定義菜單對象(QMenu)
- 通過QMenu的addAction()函數,添加子項,並連接到槽函數
- 定義事件過濾器,判斷是否是QTableView的QEvent::ContextMenu事件
- 判斷成功,則調用menu.exec(cursor().pos()),在當前鼠標位置打開菜單
效果:
代碼如下
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(); }