Solución:
Primero, configure QTreeWidget para responder (emitir señal) clic derecho del mouse:
treeWidget->setContextMenuPolicy(Qt::CustomContextMenu);
En segundo lugar, conecte la señal con su ranura “MainWindow :: prepareMenu”:
connect(treeWidget,&QTreeWidget::customContextMenuRequested,this,&MainWindow::prepareMenu);
En tercer lugar, cree un menú contextual en la ranura:
void MainWindow::prepareMenu( const QPoint & pos )
{
QTreeWidget *tree = treeWid;
QTreeWidgetItem *nd = tree->itemAt( pos );
qDebug()<<pos<<nd->text(0);
QAction *newAct = new QAction(QIcon(":/Resource/warning32.ico"), tr("&New"), this);
newAct->setStatusTip(tr("new sth"));
connect(newAct, SIGNAL(triggered()), this, SLOT(newDev()));
QMenu menu(this);
menu.addAction(newAct);
QPoint pt(pos);
menu.exec( tree->mapToGlobal(pos) );
}
Primero debe establecer la política del menú contextual en CustomContextMenu
:
treeView->setContextMenuPolicy(Qt::CustomContextMenu);
Entonces puedes conectarte al QWidget::customContextMenuRequested(const QPoint&)
señal y muestra tu menú contextual.
Para aquellos que prefieren usar el diseñador más, aquí hay otra forma de hacerlo:
1) Establecer la política del menú contextual en el menú contextual personalizado
O por código:
ui->treeWidget->setContextMenuPolicy(Qt::CustomContextMenu);
o usando el diseñador gráfico, haga clic en el widget de árbol y configúrelo usando el Editor de propiedades:
2) Crear función de controlador
En el diseñador, haga clic con el botón derecho en el widget de árbol y seleccione la opción “Ir a la ranura …”. Aparecerá una ventana similar a esta:
Haga clic en la opción “CustomContextMenuRequested (QPoint)”. La función del controlador se definirá, declarará y se conectará automáticamente.
void MainWindow::on_treeWidget_customContextMenuRequested(const QPoint &pos)
{
// this function will be called on right click
}
Este paso también se puede realizar definiendo y conectando la función de ranura usted mismo.
3) Cree las opciones en el menú contextual.
Vaya a la pestaña del editor de acciones (generalmente acoplada en la parte inferior del diseñador). Agregue las acciones que desea tener en el menú contextual haciendo clic en el botón nuevo en la parte superior izquierda. Encontrará una interfaz de este tipo:
Puede (opcionalmente) tener una información sobre herramientas o un icono para la acción, o hacer que se pueda marcar. Puede crear un atajo como Ctrl + C para una acción de copia.
4) Crea el menú y enciéndelo
void MainWindow::on_treeWidget_customContextMenuRequested(const QPoint &pos)
{
QMenu menu(this); // add menu items
menu.addAction(ui->actionDelete);
menu.addEdit(ui->actionDelete);
...
ui->actionDelete->setData(QVariant(pos)); // if you will need the position data save it to the action
menu.exec( ui->treeWidget->mapToGlobal(pos) );
}
5) Cree funciones de controlador para cada acción
Como en el paso 2, cree la función de ranura y conéctela manualmente, o haga clic con el botón derecho en una acción, haga clic en la opción “Ir a ranuras …” y seleccione la ranura activada ().
6) Por último, aplique su lógica en la función de ranura
void MainWindow::on_actionEdit_triggered()
{
QTreeWidgetItem *clickedItem = ui->treeWidget->itemAt(ui->actionDelete->data().toPoint());
// your logic
}