1. 程式人生 > >QTableWidget之右鍵選單的實現!

QTableWidget之右鍵選單的實現!

QTableWidget類提供了一種基於條目(item)的表格檢視模型,在該部件中資料以item為基本單位,每條資料(item)對應一個QTableWidgetItem類的物件,所有資料形成的item組成整個表格。接下來我們建立一個用來顯示學生資訊的表格,以此為例說明TableWidget的一些常用功能。

1.建立QTableWidget

首先建立studentInfo類,然後在Qt Desinger模式下建立一個QTableWidget部件,對其命名為stuTableWidget。通過在該部件上點選右鍵建立列項表頭,建立完畢後也就同時指定了該表格的列項數。如下:

2.初始化

除了直接在設計模式下建立行數和列數外,我們還可以通過呼叫相應的方法來設定。比如我們通過setRowCount方法在studentInfo類的構造方法中即可指定行項數。

1 ui->stuTableWidget->setRowCount(30);

該方法在建立行的同時會自動建立一個用來顯示行號的列項,如下:

如果我們的表格只用來顯示資訊,並不涉及對相應資訊的修改,則可以通過下述方法將表格設定為只讀模式:

1 ui->stuTableWidget->setEditTriggers(QAbstractItemView::NoEditTriggers);

setEditTriggers()是QAbstractItemView類中的一個方法,通過向該方法傳遞相應的引數以設定item的一些屬性,比如NoEditTriggers引數可將item設定為只讀,DoubleClicked代表雙擊時item可修改。而QTableWidget繼承了QAbstractItemView方法,因此它可以使用該函式。

3.資訊顯示

表格檢視中資料的獲取隨用途的不同而不同。如果使用於C/S模型的客戶端,那麼表格中的資訊需要從伺服器端傳送到本地,再相應解析;如果使用在資料庫中,則需要從資料庫中獲取相應資訊。這裡假定資料已經到達本地,我們通過下面的方法來顯示資料資訊。

01 void studentInfo::showInfo()
02 {
03 QTableWidgetItem *tmpItem;
04
05 tmpItem =new QTableWidgetItem(QString("04065061"));
06 ui->stuTableWidget->setItem(0, 0, tmpItem);
07
08 tmpItem =new QTableWidgetItem(QString("edsionte"));
09 ui->stuTableWidget->setItem(0, 1, tmpItem);
10
11 tmpItem =new QTableWidgetItem(QString("1988.01.28"));
12 ui->stuTableWidget->setItem(0, 2, tmpItem);
13
14 tmpItem =new QTableWidgetItem(QString("male"));
15 ui->stuTableWidget->setItem(0, 3, tmpItem);
16
17 tmpItem =new QTableWidgetItem(QString("Xi'an Institute of Posts and Telecommunications"));
18 ui->stuTableWidget->setItem(0, 4, tmpItem);
19 }

上述的showInfo方法為第一行設定了相應資訊,我們可以看到表格的一行中每個具體的列項都對應一個QTableWidgetItem物件,並通過在setItem方法中指定行號和列號將該item物件設定到表格的具體位置。在上述的showInfo方法中,我們分別通過該方法建立了第一行的第一到第五列的資料(行列下表從0開始)。

4.為表格資料新增右鍵選單

有時候我們想通過點選滑鼠右鍵對錶格資料進行一些其他操作,比如複製、檢視詳情等,我們可以按照下面的方法來實現。為了實現點選右鍵彈出選單這個功能,我們必須在類studentInfo類中宣告一個選單變數popMenu和一個選單選項變數action。

01 class studentInfo : public QMainWindow
02 {
03 …………
04 private:
05 Ui::studentInfo *ui;
06 QMenu *popMenu;
07 QAction *action;
08
09 private slots:
10 voidon_stuTableWidget_customContextMenuRequested(QPoint pos);
11 …………
12 };

宣告完畢後,我們在studentInfo類的建構函式中對其進行初始化,如下:

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

setContextMenuPolicy方法用來設定widget選單項的顯示方法,而CustomContextMenu是唯一與郵件選單有關的引數,因此這裡我們將選單顯示方法設定為該型別。如果widget設定為CustomContextMenu時,當在資料上點選右鍵時就會發送customContextMenuRequested ( const QPoint & pos )訊號,該訊號還會捕捉到點選右鍵的位置,並用pos引數來儲存。與此訊號關聯的槽函式我們定義如下:

1 void studentInfo::on_stuTableWidget_customContextMenuRequested(QPoint pos)
2 {
3 popMenu->addAction(action);
4 popMenu->exec(QCursor::pos());
5 }

我們首先將選單選項action新增到郵件彈出選單popMenu中,再通過exec方法在pos()位置顯示該郵件選單,pos()返回的位置即為點選滑鼠的位置。

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

1 void studentInfo::rightClickedOperation()
2 {
3 //do something
4 }

定義好槽函式,最關鍵的是與相應的訊號連線。對於上述兩個槽函式,我們可以使用兩種方法進行訊號和槽的關聯:在Qt Desinger模式下新增或手動進行connect關聯。對於customContextMenuRequested訊號,我們使用前種方法實現訊號和槽的關聯;對於右鍵選單選項的功能實現,我們可以通過connect函式實現,如下:

1 connect(action, SIGNAL(triggered()), this, SLOT(rightClickedOperation()));