水曜日, 11月 08, 2023

QTableWidget で右クリックメニュー(コンテキストメニュー)

 

QTableWidget で右クリックメニューを出す方法です。

まずQTableWidget でコンテキストメニューを有効化する必要があります。

ui->tableWidget->setContextMenuPolicy(Qt::CustomContextMenu);
connect(ui->tableWidget, &QTableWidget::customContextMenuRequested, this,
&MainWindow::deleteState);


呼び出したメソッドでメニューを作り、popup() メソッドで表示します。

void MainWindow::deleteState(const QPoint &pos) {
QMenu *menu = new QMenu(this);
QAction *ciz = new QAction("&Delete State");
connect(ciz, &QAction::triggered, this, &MainWindow::deleteStateItem);
menu->addAction(ciz);
menu->popup(ui->tableWidget->viewport()->mapToGlobal(pos));
int row = ui->tableWidget->itemAt(pos)->row();
m_currentState = ui->tableWidget->item(row, 0)->text().toInt();
}

アクションを設定し、実行したいメソッドを connect() で設定します。

セルの位置はマウスクリックの位置から itemAt() で計算します。

位置情報はクラス変数で保存すると使いやすいかもしれません。

あと、QTableWidgetItem が設定されていないセルではメニューを表示しない設定もできます。

void MainWindow::deleteNumber(const QPoint &pos)
{
QTableWidgetItem* item=ui->tabWidget->itemAt(pos);
if(item!=nullptr){
QMenu *menu = new QMenu(this);
QAction *action = new QAction("&Delete Number");
connect(action, &QAction::triggered, this, &MainWindow::deleteItem);
menu->addAction(action);
menu->popup(ui->tabWidget->viewport()->mapToGlobal(pos));
int row = item->row();
m_current = ui->tabWidget->item(row, 0)->text().toInt();
}
}

Qt: 外部プログラムを起動する

  Qt/C++ のアプリは、外部へ直接アクセスできます。これはネットアプリでは不可能な Qt のメリットです。 外部プログラムを起動することもできます。QProcess::startDetached() を使うと独立したプロセスを立ち上げることができます。 この QProces...