2015-05-27 4 views
0

Я хочу создать меню правой кнопки мыши из ввода QTreeView. В настоящее время я пробовал это, но я не хочу, чтобы весь treeView генерировал правый щелчок, а затем меня, чтобы отфильтровать позицию, на которой находится мышь. Я хочу, чтобы сигнал генерировался из записи.Щелкните правой кнопкой мыши на элементе QTreeView

connect(mtreeView, SIGNAL(customContextMenuRequested(const QPoint&)), 
     this, SLOT(showContextMenu(const QPoint&))); 

Спасибо!

+3

В чем проблема? Вы можете использовать 'QAbstractItemView :: indexAt (const QPoint & point)' в своем слоте, чтобы получить элемент, который запросил меню. – hank

+0

Хорошо, но возможно ли генерировать сигнал из элемента ввода? – yonutix

+0

Я бы также рекомендовал использовать 'QAbstractItemView :: indexAt (const QPoint & point)' как @hank. Но если вы действительно хотите получить сигнал самого элемента, вы можете использовать 'QTreeWidget' вместо' QTreeView'. Чтобы получить сигнал, вы можете установить 'QPushButton' или' QToolButton' как элементный виджет с вызовом 'QTreeWidget :: setItemWidget' и подключиться к сигналу нажатой кнопки. – tomvodi

ответ

5

Метод 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); 
} 
2

Что я делаю, это переопределить mouseReleaseEvent и проверить вручную.

void MyTreeView::mouseReleaseEvent(QMouseEvent *e) { 
    if (e->button() == Qt::RightButton) { 
     QTreeWidgetItem *item = itemAt(e->pos()); 
     if (item) { 
      QMenu m; 
      m.addAction("hello"); 
      m.addAction("world"); 
      QAction *selected = m.exec(mapToGlobal(e->pos())); 
      if (selected) { 
       qDebug() << "selected" << selected->text(); 
      } 
     } 
    } else { 
     QTreeView::mouseReleaseEvent(e); 
    } 
} 
+0

mouseReleaseEvent связан с каким сигналом? – yonutix

+0

Это не слот, а защищенная виртуальная функция, унаследованная от 'QWidget'. Он автоматически вызывается автоматически каждый раз, когда пользователь отпускает кнопку мыши. – songziming

0

Что вы имеете в виду запись не представлена ​​QObject в Qt. Только модель элемента - QObject, но отдельные узлы дерева не являются QObject s в системе Qt item/view.

Поэтому они не могут испускать какой-либо сигнал