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));
}
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