QTableWidget之右鍵菜單的實現!

原文地址:http://edsionte.com/techblog/archives/3014 

 

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()));
發佈了23 篇原創文章 · 獲贊 28 · 訪問量 35萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章