Метод 1
Лучше использовать ContextMenuEvent, а не MouseReleaseEvent, так как это более переносимый способ, чтобы вызвать контекстное меню, будет поддерживать доступность на определенных платформах, и т.д ... правый клик - это не единственный способ открыть контекстное меню.
Если вы не хотите, чтобы подкласс QTreeView, установить обработчик события из главного окна:
ui->myTreeView->installEventFilter(this);
Затем обработать событие в главном окне filterEvent
bool MainWindow::eventFilter(QObject *target, QEvent *event)
{
if (target == ui->myTreeView)
{
QContextMenuEvent* m = dynamic_cast<QContextMenuEvent*>(event);
if (event->type() == QEvent::ContextMenu && e!=0)
{
//Create context menu here
return true;
}
}
return false;
}
Метод 2
Изменение режима контекстного меню на сигнал:
ui->myTreeView->setContextMenuPolicy(Qt::CustomContextMenu);
connect(ui->myTreeView, SIGNAL(customContextMenuRequested(QPoint)),
this, SLOT(treeCustomMenu(QPoint)));
Затем реализовать слот:
void MainWindow::treeCustomMenu(const QPoint & pos)
{
//Implement your menu here using myTreeView->itemAt(pos);
}
В чем проблема? Вы можете использовать 'QAbstractItemView :: indexAt (const QPoint & point)' в своем слоте, чтобы получить элемент, который запросил меню. – hank
Хорошо, но возможно ли генерировать сигнал из элемента ввода? – yonutix
Я бы также рекомендовал использовать 'QAbstractItemView :: indexAt (const QPoint & point)' как @hank. Но если вы действительно хотите получить сигнал самого элемента, вы можете использовать 'QTreeWidget' вместо' QTreeView'. Чтобы получить сигнал, вы можете установить 'QPushButton' или' QToolButton' как элементный виджет с вызовом 'QTreeWidget :: setItemWidget' и подключиться к сигналу нажатой кнопки. – tomvodi