QTableWidget 應用總結

本文引用自:http://blog.sina.com.cn/s/blog_9c41e8ed01011mma.html

QTableWidget是QT程序中常用的顯示數據表格的空間,很類似於VC、C#中的DataGrid。

它跟QTabelView的區別:

QTableWidget是QTableView的子類,QTableView可以使用自定義的數據模型來顯示內容(也就是先要通過setModel來綁定數據源),QTableWidget則只能使用標準的數據模型,並且其單元格數據是QTableWidgetItem的對象來實現的(也就是不需要數據源,將逐個單元格內的信息填好即可)。這主要體現在QTableView類中有setModel成員函數,而到了QTableWidget類中,該成員函數變成了私有。使用QTableWidget就離不開QTableWidgetItem。QTableWidgetItem用來表示表格中的一個單元格,正個表格都需要用逐個單元格構建起來。

複製代碼
 1 #include <QtGui/QApplication> 
 2 #include <QTableWidget> 
 3 #include <QTableWidgetItem>
 4 
 5 int main(int argc, char *argv[]) 
 6 { 
 7 QApplication a(argc, argv); 
 8 QTableWidget *tableWidget = new QTableWidget(10,5); // 構造了一個QTableWidget的對象,並且設置爲10行,5列 
 9 // 也可用下面的方法構造QTableWidget對象 
10 // QTableWidget *tableWidget = new QTableWidget; 
11 // tableWidget->setRowCount(10); //設置行數爲10 
12 // tableWidget->setColumnCount(5); //設置列數爲5 
13 tableWidget->setWindowTitle("QTableWidget & Item"); 
14 tableWidget->resize(350, 200); //設置表格 
15 QStringList header; 
16 header<<"Month"<<"Description"; 
17 tableWidget->setHorizontalHeaderLabels(header); 
18 tableWidget->setItem(0,0,new QTableWidgetItem("Jan")); //設置表項(行、列、項)
19 tableWidget->setItem(1,0,new QTableWidgetItem("Feb")); 
20 tableWidget->setItem(2,0,new QTableWidgetItem("Mar"));
21 
22 tableWidget->setItem(0,1,new QTableWidgetItem(QIcon("images/IED.png"), "Jan's month")); 
23 tableWidget->setItem(1,1,new QTableWidgetItem(QIcon("images/IED.png"), "Feb's month")); 
24 tableWidget->setItem(2,1,new QTableWidgetItem(QIcon("images/IED.png"), "Mar's month")); 
25 tableWidget->show();
26 
27 return a.exec(); 
28 }
29 
30  
複製代碼


一. 對QTableWidget本身的效果實現

 1. 將表格變爲禁止編輯

 在默認情況下,表格裏的字符是可以更改的,比如雙擊一個單元格,就可以修改原來的內容,如果想禁止用戶的這種操作,讓這個表格對用戶只讀,可以這樣:

 tableWidget->setEditTriggers(QAbstractItemView::NoEditTriggers);

QAbstractItemView.NoEditTriggers是QAbstractItemView.EditTrigger枚舉中的一個,都是觸發修改單元格內容的條件:

QAbstractItemView.NoEditTriggers 

No editing possible. 不能對錶格內容進行修改

QAbstractItemView.CurrentChanged 

Editing start whenever current item changes.任何時候都能對單元格修改

QAbstractItemView.DoubleClicked 

Editing starts when an item is double clicked.雙擊單元格

QAbstractItemView.SelectedClicked 

Editing starts when clicking on an already selected item.單擊已選中的內容

QAbstractItemView.EditKeyPressed 

Editing starts when the platform edit key has been pressed over an item.

QAbstractItemView.AnyKeyPressed 
16 
Editing starts when any key is pressed over an item.按下任意鍵就能修改

QAbstractItemView.AllEditTriggers 
31 
Editing starts for all above actions.以上條件全包括

 

2. 設置表格爲整行選擇

tableWidget->setSelectionBehavior(QAbstractItemView::SelectRows); //整行選中的方式

QAbstractItemView.SelectionBehavior枚舉還有如下類型

Constant 
Value 
Description

QAbstractItemView.SelectItems 

Selecting single items.選中單個單元格

QAbstractItemView.SelectRows 

Selecting only rows.選中一行

QAbstractItemView.SelectColumns 

Selecting only columns.選中一列

3.單個選中和多個選中的設置:

tableWidget->setSelectionMode(QAbstractItemView::ExtendedSelection); //設置爲可以選中多個目標

該函數的參數還可以是:

QAbstractItemView.NoSelection 不能選擇

QAbstractItemView.SingleSelection 選中單個目標

QAbstractItemView.MultiSelection 選中多個目標

QAbstractItemView.ExtendedSelection QAbstractItemView.ContiguousSelection 的區別不明顯,主要功能是正常情況下是單選,但按下Ctrl或Shift鍵後,可以多選

4. 表格表頭的顯示與隱藏

對於水平或垂直方法的表頭,可以用以下方式進行 隱藏/顯示 的設置:

1 tableWidget->verticalHeader()->setVisible(false); //隱藏列表頭 
2 tableWidget->horizontalHeader()->setVisible(false); //隱藏行表頭

 注意:需要 #include <QHeaderView>

 5. 對錶頭文字的字體、顏色進行設置 
注意:需要 #include <QHeaderView>

1 QTableWidgetItem *columnHeaderItem0 = tableWidget->horizontalHeaderItem(0); //獲得水平方向表頭的Item對象 
2 columnHeaderItem0->setFont(QFont("Helvetica")); //設置字體 
3 columnHeaderItem0->setBackgroundColor(QColor(0,60,10)); //設置單元格背景顏色 
4 columnHeaderItem0->setTextColor(QColor(200,111,30)); //設置文字顏色

6. 在單元格里加入控件:

 QTableWidget不僅允許把文字加到單元格,還允許把控件也放到單元格中。比如,把一個下拉框加入單元格,可以這麼做:

1 QComboBox *comBox = new QComboBox(); 
2 comBox->addItem("Y"); 
3 comBox->addItem("N"); 
4 tableWidget->setCellWidget(0,2,comBox);

二. 對單元格的進行設置

1. 單元格設置字體顏色和背景顏色 及字體字符

1 QTableWidgetItem *item = new QTableWidgetItem("Apple"); 
2 item->setBackgroundColor(QColor(0,60,10)); 
3 item->setTextColor(QColor(200,111,100)); 
4 item->setFont(QFont("Helvetica")); 
5 tableWidget->setItem(0,3,item);

另:如果需要對所有的單元格都使用這種字體,則可以使用 tableWidget->setFont(QFont("Helvetica"));

2. 設置單元格內文字的對齊方式

這個比較簡單,使用newItem.setTextAlignment()函數即可,該函數的參數爲單元格內的對齊方式,和字符輸入順序是自左相右還是自右向左。

水平對齊方式有:
Constant Value Description
Qt.AlignLeft 0x0001 Aligns with the left edge.
Qt.AlignRight 0x0002 Aligns with the right edge.
Qt.AlignHCenter 0x0004 Centers horizontally in the available space.
Qt.AlignJustify 0x0008 Justifies the text in the available space.

垂直對齊方式:
Constant Value Description
Qt.AlignTop 0x0020 Aligns with the top.
Qt.AlignBottom 0x0040 Aligns with the bottom.
Qt.AlignVCenter 0x0080 Centers vertically in the available space.

如果兩種都要設置,只要用 Qt.AlignHCenter | Qt.AlignVCenter 的方式即可

3. 合併單元格效果的實現:

tableWidget->setSpan(0, 0, 3, 1) # 其參數爲: 要改變單元格的 1行數 2列數 要合併的 3行數 4列數

4. 設置單元格的大小

首先,可以指定某個行或者列的大小

1 tableWidget->setColumnWidth(3,200); 
2 tableWidget->setRowHeight(3,60);

還可以將行和列的大小設爲與內容相匹配

1 tableWidget->resizeColumnsToContents(); 
2 tableWidget->resizeRowsToContents();

5. 獲得單擊單元格的內容

通過實現 itemClicked (QTableWidgetItem *) 信號的槽函數,就可以獲得鼠標單擊到的單元格指針,進而獲得其中的文字信息

connect(tableWidget,SIGNAL(itemDoubleClicked(QTreeWidgetItem*,int)),this, SLOT( getItem(QTreeWidgetItem*,int)) );

//將itemClicked信號與函數getItem綁定

6.表項自適應寬度


qt5.0以下版本:

ui->tablewidget->horizontalHeader()->setResizeMode(QHeaderView::Stretch);

qt5.0以後版本:

ui->tablewidget->horizontalHeader()->setSectionResizeMode (QHeaderView::Stretch);


7.QTableWidgetItem轉QString

QTableWidgetItem->data(Qt::DisplayRole)->toString()

8.將表格設定爲可以根據某一列進行排序

QTableWidget允許多種數據類型的設置,理論上來說只要是QVariant能夠接受的類型,都可以作爲表格的內容來呈現。一般的文字信息採用setText()來設置,而如果是其他類型,比如int,則需要使用setData()來設置。注意,這兩個函數都是QTableWidgetItem提供的。如果沒有前導0這樣的特殊需求,推薦使用setData()而不是setText(QString::number())的方式來設置數值,因爲這樣將導致數字類型的數據在排序時出現10比2優先的情況。另外,在重複設置數據的時候,可能表格原有的行數或列數已不滿足現有的需求,那麼可以使用clearContents()清空表格的所有內容(包括行數與列數)。如果有誰需要只讀的表格(拒絕雙擊進行數據編輯),那麼可以試試QTableWidgetItem的setFlags()進行操控,只要不設置可編輯標識即可。
而至於排序,只需要使用setSortingEnabled()或者sortByColumn()來開啓。需要注意的是,如果在排序開啓後需要增加數據,應該先關閉排序再增加數據,之後再重新開啓排序,否則由於排序的干擾,數據的增加將產生問題。如果希望進行一個自定義的排序(既不是基於字母,也不是基於數字大小),那麼嘗試繼承QTableWidgetItem並重新實現operator<()函數將起到不小的作用。
如果你的用戶希望對錶格進行一定程度的動態過濾,不要重新讀取數據,setRowHidden()以及setColumnHidden()是個不錯的選擇。

9.表格表頭。
表格表頭可以靠horizontalHeader()以及verticalHeader()這兩個成員函數獲取,這兩個函數來自於QTableWidget的父類QTableView,得到的返回值類型是QHeaderView*。
通過獲得表頭還可以對錶格的拉伸進行設置。相關的函數均來自於QHeaderView:setStretchLastSection()、sectionAutoResize()、setResizeMode()。
表頭的文字則可以由setHorizontalHeaderLabels()、以及setVerticalHeaderLabels()來設置。
如果你想要使用一個自定義的表頭類,則可以使用setVerticalHeaderItem()、setHorizontalHeaderItem()來進行設置

10.爲表格數據添加右鍵菜單

有時候我們想通過點擊鼠標右鍵對錶格數據進行一些其他操作,比如複製、查看詳情等,我們可以按照下面的方法來實現。爲了實現點擊右鍵彈出菜單這個功能,我們必須在類studentInfo類中聲明一個菜單變量popMenu和一個菜單選項變量action

聲明完畢後,我們在studentInfo類的構造函數中對其進行初始化,如下:

複製代碼
 1 class studentInfo : public QMainWindow
 2 {
 3 …………
 4 private:
 5     Ui::studentInfo *ui;
 6     QMenu *popMenu;
 7     QAction *action;
 8 
 9 private slots:
10     void on_stuTableWidget_customContextMenuRequested(QPoint pos);
11 …………
12 };
複製代碼

 聲明完畢後,我們在studentInfo類的構造函數中對其進行初始化,如下:

1 ui->stuTableWidget->setContextMenuPolicy(Qt::CustomContextMenu);  
2 popMenu = new QMenu(ui->stuTableWidget);  
3 action = new QAction("Copy", this); 

setContextMenuPolicy方法用來設置widget菜單項的顯示方法,而CustomContextMenu是唯一與右鍵菜單有關的參數,因此這裏我們將菜單顯示方法設置爲該類型。如果widget設置爲CustomContextMenu時,當在數據上點擊右鍵時就會發送customContextMenuRequested ( const QPoint & pos )信號,該信號還會捕捉到點擊右鍵的位置,並用pos參數來存儲。與此信號關聯的槽函數我們定義如下:

複製代碼
1 void studentInfo::on_stuTableWidget_customContextMenuRequested(QPoint pos)  
2 
3  {  
4 
5      popMenu->addAction(action);  
6 
7      popMenu->exec(QCursor::pos());  
8 
9  } 
複製代碼

 

我們首先將菜單選項action添加到右鍵彈出菜單popMenu中,再通過exec方法在pos()位置顯示該右鍵菜單,pos()返回的位置即爲點擊鼠標的位置。

現在,如果點擊右鍵菜單選項並不會發生任何動作,這是因爲我們並沒有關聯相應的槽函數。由於具體的菜單選項不同,其函數的實現也不同,這裏我們只給出框架,如下:

複製代碼
1 void studentInfo::rightClickedOperation()  
2 
3  {  
4 
5      //do something  
6 
7  } 
複製代碼

 

定義好槽函數,最關鍵的是與相應的信號連接。對於上述兩個槽函數,我們可以使用兩種方法進行信號和槽的關聯:在Qt Desinger模式下添加或手動進行connect關聯。對於customContextMenuRequested信號,我們使用前種方法實現信號和槽的關聯;對於右鍵菜單選項的功能實現,我們可以通過connect函數實現,如下:
1 connect(action, SIGNAL(triggered()), this, SLOT(rightClickedOperation()));

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章