1. 程式人生 > 實用技巧 >Qt TableView右鍵彈出選單

Qt TableView右鍵彈出選單

TableView右鍵彈出選單

關於TableView的控制元件使用,這裡不做解釋了,直接說訴求,右鍵點選選中的某一行(術語稱item),彈出選單。操作結果如下圖:

實現過程主要包括以下幾個重點:

1、初始化一個TableView控制元件表

主要需要完成表頭的設定,表格屬性的設定。
程式碼如下:

point_time_model 表示TableView控制元件對應的model:

point_time_model = new QStandardItemModel(ui->Point_Time_tableView);

初始化:

 1 const int table_cols = 3; //有幾列
2 QStringList headerList; 3 headerList << "位置" << "監測時長" << " " ; 4 point_time_model->setHorizontalHeaderLabels(headerList); 5 point_time_model->setColumnCount(table_cols); 6 //設定列表屬性 7 ui->Point_Time_tableView->verticalHeader()->setVisible(false); //隱藏列表頭
8 ui->Point_Time_tableView->setSelectionBehavior(QAbstractItemView::SelectRows); //選擇整行 9 ui->Point_Time_tableView->setSelectionMode(QAbstractItemView::SingleSelection); //只選擇一行 10 ui->Point_Time_tableView->horizontalHeader()->setStretchLastSection(true); //最後一列填滿表 11 ui->Point_Time_tableView->setContextMenuPolicy(Qt::CustomContextMenu); //
可彈出右鍵選單

其中,ui->Point_Time_tableView->setContextMenuPolicy(Qt::CustomContextMenu); !!!這裡是重點!!!

2 、為TableView控制元件表新增右鍵選單

首先需要建立一個選單,併為選單新增行為,程式碼如下:
.cpp檔案中

1 QMenu *popMenu; //選單
2 popMenu = new QMenu(ui->Point_Time_tableView);
3 QAction *actionUpdateInfo = new QAction();
4 QAction *actionDelInfo = new QAction();
5 actionUpdateInfo ->setText(QString("修改"));
6 actionDelInfo ->setText(QString("刪除"));
7 popMenu->addAction(actionUpdateInfo);
8 popMenu->addAction(actionDelInfo);

到這裡,右鍵選單已經建立好了,接下來的關鍵步驟是,如何右鍵點選一行,彈出該選單,需要用到槽和訊號機制。

3 、右鍵彈出選單的槽和訊號機制

.h檔案中

1 private slots:
2      //右鍵選單響應函式
3      void slotContextMenu(QPoint pos);

.cpp檔案中,在第2步的程式碼之後初始化槽訊號的connect函式:

connect(ui->Point_Time_tableView, SIGNAL(customContextMenuRequested(QPoint)), this, SLOT(slotContextMenu(QPoint)));

(1)該連線函式中的SIGNAL(customContextMenuRequested(QPoint))是QMenu的自帶響應訊號。
(2)SLOT(slotContextMenu(QPoint)))中的槽函式需要自己實現,程式碼如下:

1 void MainWindow::slotContextMenu(QPoint pos)
2 {
3    auto index = ui->Point_Time_tableView->indexAt(pos);
4     if (index.isValid())
5     {
6         popMenu->exec(QCursor::pos()); // 選單出現的位置為當前滑鼠的位置
7     }
8 }

以上,右鍵點選某一行時,選單就會出現,相應的每一個選單需要什麼樣的響應操作,就是後續的槽和訊號之間的操作。