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
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.
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'
}
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. –
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));
}
Es scheint komplizierter zu sein, dass ich gelernt habe. Also muss ich praktisch das customContextMenuRequested Signal mit meinem Slot verbinden? – ISTB
Ja, Sie sollten einen Steckplatz haben, der nach dem Auffangen dieses Signals Ihr benutzerdefiniertes Kontextmenü anzeigt. – hank