2013-01-09 6 views
9

Ich sah mich um und es scheint, dass das Problem nicht nur für Baum-Widget, sondern auch für andere Widgets vorhanden ist. Aber in meinem Fall fand ich eine Lösung, obwohl eine unvollständige. Ich füge meinem Baum-Widget Aktionen hinzu, sodass beim Klicken mit der rechten Maustaste ein Popup mit diesen Aktionen angezeigt wird. Wenn ich jedoch Elemente zu meinem Baum-Widget hinzufüge und mit der rechten Maustaste darauf klicke, wird das gleiche Popup angezeigt. Was ich tun möchte, ist, dass, wenn Sie mit der rechten Maustaste auf das Baum-Widget klicken, ein Baum-Widget-Popup-Menü erscheint und wenn Sie mit der rechten Maustaste auf Elemente klicken, erscheint ein weiteres Popup-Menü. Weiß jemand, wie man das macht?QTreeWidget Rechtsklickmenü

Antwort

14

Zuerst sollten Sie benutzerdefinierte Kontextmenü Richtlinie festgelegt:

treeView->setContextMenuPolicy(Qt::CustomContextMenu); 

Dann können Sie mit dem QWidget::customContextMenuRequested(const QPoint&) Signal anschließen und Kontextmenü angezeigt.

+0

Es scheint komplizierter zu sein, dass ich gelernt habe. Also muss ich praktisch das customContextMenuRequested Signal mit meinem Slot verbinden? – ISTB

+0

Ja, Sie sollten einen Steckplatz haben, der nach dem Auffangen dieses Signals Ihr benutzerdefiniertes Kontextmenü anzeigt. – hank

2

Werfen Sie einen Blick auf das Überladen von QAbstractItemModel und das Bereitstellen eines eigenen OnContextMenuRequested. Über diese Funktion können Sie mit verschiedenen Elementen verschiedene Kontextmenüs erstellen.

Hier einige verkürzte pseudo-ish-Code aus einem meiner Projekte, die hilfreich sein können:

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

Es gibt keinen Grund dafür, dies im Modell zu sein. Es ist ein Signal aus der Sicht, über das das Modell normalerweise nichts wissen sollte. –

14

Zuerst Config QTreeWidget zur Antwort (Emissionssignal) rechte Maustaste:

treeWidget->setContextMenuPolicy(Qt::CustomContextMenu); 

Zweite , schließen Sie das Signal mit dem Schlitz "Mainwindow :: prepareMenu":

connect(treeWidget,&QTreeWidget::customContextMenuRequested,this,&MainWindow::prepareMenu); 

Drittens erstellen Kontextmenü im Steckplatz:

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