2013-01-09 12 views
9

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

14

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.

+0

Wydaje mi się, że jest to bardziej skomplikowane niż sądziłem. Więc praktycznie muszę podłączyć sygnał customContextMenuRequested do mojego gniazda? – ISTB

+0

Tak, powinieneś mieć slot, który pokaże twoje niestandardowe menu kontekstowe po złapaniu tego sygnału. – hank

2

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' 
} 
+1

Nie ma powodu, aby to było w modelu. To sygnał z widoku, o którym model zazwyczaj nie powinien wiedzieć. –

14

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)); 
} 
Powiązane problemy