Rozejrzałem się i wygląda na to, że problem występuje nie tylko w widżecie drzewa, ale także w innych widżetach. Ale w moim przypadku znalazłem rozwiązanie, choć niekompletne. Dodaję akcje do mojego widgetu drzewa, tak że po kliknięciu prawym przyciskiem myszy pojawi się okno z tymi czynnościami. Jednak gdy dodaję elementy do mojego widgetu drzewa i klikam je prawym przyciskiem myszy, pojawia się to samo okno. To, co chciałbym zrobić, to to, że gdy klikniesz prawym przyciskiem myszy na widżet drzewa, pojawi się menu podręczne drzewa i po kliknięciu prawym przyciskiem myszy pojawi się kolejne odpowiednie menu. Czy ktoś wie, jak to zrobić?QTreeWidget kliknij prawym przyciskiem myszy menu
Odpowiedz
Najpierw należy ustawić niestandardową politykę Menu kontekstowe:
treeView->setContextMenuPolicy(Qt::CustomContextMenu);
Następnie można podłączyć do sygnału QWidget::customContextMenuRequested(const QPoint&)
i pokazać swoje menu kontekstowe.
Przyjrzyj się przeciążeniu QAbstractItemModel i zapewnieniu własnego OnContextMenuRequested. Za pomocą tej funkcji możesz mieć różne przedmioty tworzyć różne menu kontekstowe.
Oto niektóre skrócone pseudo-owski kod z jednego z moich projektów, które mogą być pomocne:
void MyModel::OnContextMenuRequested(const QModelIndex& index, const QPoint& globalPos)
{
// find 'node' corresponding to 'index'
vector<pair<string,BaseNode*> > actions = node->GetActions(true);
if(actions.size()==0) return;
// the ptr list helps us delete the actions
boost::ptr_list<QObject> actionPtrList;
QList<QAction*> qtActions;
for(unsigned int i=0;i<actions.size();i++)
{
QAction* act = new QAction(actions[i].first.c_str(),NULL);
act->setData(qVariantFromValue(actions[i].second));
actionPtrList.push_back(act);
qtActions.append(act);
}
// create and show the context menu
QMenu *menu = new QMenu("Item actions",NULL);
actionPtrList.push_back(menu);
QAction* act = menu->exec(qtActions,globalPos);
if(act==NULL) return;
// act on the resulting action 'act'
}
Nie ma powodu, aby to było w modelu. To sygnał z widoku, o którym model zazwyczaj nie powinien wiedzieć. –
pierwsze, config QTreeWidget do odpowiedzi (emitowania sygnału) prawym przyciskiem myszy:
treeWidget->setContextMenuPolicy(Qt::CustomContextMenu);
sekundę , połącz sygnał z gniazdem "MainWindow :: prepareMenu":
connect(treeWidget,&QTreeWidget::customContextMenuRequested,this,&MainWindow::prepareMenu);
Po trzecie utwórz menu kontekstowe w gnieździe:
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));
}
- 1. Kliknij prawym przyciskiem myszy JavaFX?
- 2. WPF listview kliknij prawym przyciskiem myszy problem
- 3. Applescript kliknij prawym przyciskiem myszy plik
- 4. DataGridView kliknij prawym przyciskiem myszy menu/kopiuj przykład?
- 5. Kliknij prawym przyciskiem myszy menu kontekstowe Java JTree?
- 6. Kliknij prawym przyciskiem myszy w ClojureScript?
- 7. Selenium 2 kliknij prawym przyciskiem myszy
- 8. Przechwytywanie Kliknij prawym przyciskiem myszy HTML DIV
- 9. jTable menu podręczne prawym przyciskiem myszy
- 10. Jak dodać pozycję menu w Windows kliknij prawym przyciskiem myszy menu
- 11. Jak powiązać z prawym przyciskiem myszy kliknij w knockoutJs?
- 12. Kliknij prawym przyciskiem myszy w Pythonie za pomocą ctypów
- 13. Objective-C: NSStatusBar kliknij prawym i lewym przyciskiem myszy
- 14. Kliknij prawym przyciskiem myszy, aby wybrać wiersz w danychGridView
- 15. Kliknij prawym przyciskiem myszy, działając inaczej niż kliknięcie lewym przyciskiem myszy.
- 16. JList Kliknięcie prawym przyciskiem myszy pokazuje menu (użyj, upuść, anuluj)
- 17. Zmiana opcji menu kontekstowego z prawym przyciskiem myszy w VS2008
- 18. Dostosowywanie Eksplorator obiektów SQL Server Kliknij prawym przyciskiem myszy Pozycje menu
- 19. Przechwytywanie zdarzenia kliknięcia prawym przyciskiem myszy kontrolki przeglądarki internetowej
- 20. wyłączyć kliknij prawym przyciskiem bez js i css
- 21. Ionic uruchamia niechciane kliknięcie prawym przyciskiem myszy i kliknięcie środkowe
- 22. Angular 2 zdarzenia z kliknięcia prawym przyciskiem myszy?
- 23. Silverlight Datagrid wybierz po kliknięciu prawym przyciskiem myszy
- 24. Zdarzenie wiązania w celu kliknięcia prawym przyciskiem myszy
- 25. kliknięcie prawym przyciskiem myszy lokalizacji zdarzenia akcji popmenu
- 26. jak kliknąć prawym przyciskiem myszy na pozycji z Listbox i otworzyć menu na WPF
- 27. Vue JS: kliknij prawym dyrektywę zdarzeń
- 28. Prevent kopiuj/wklej i kliknij prawym przyciskiem myszy przeznaczone dla tekstowym (adres e-mail)
- 29. Wyłącz prawym przyciskiem myszy wyskakujące okienko "Silverlight" w comboboxach
- 30. coraz tekst hiperłącza na Chrome kliknij prawym
Wydaje mi się, że jest to bardziej skomplikowane niż sądziłem. Więc praktycznie muszę podłączyć sygnał customContextMenuRequested do mojego gniazda? – ISTB
Tak, powinieneś mieć slot, który pokaże twoje niestandardowe menu kontekstowe po złapaniu tego sygnału. – hank