2013-01-09 15 views
9

मैंने चारों ओर देखा और ऐसा लगता है कि समस्या न केवल वृक्ष विजेट के लिए बल्कि अन्य विगेट्स के लिए भी मौजूद है। लेकिन मेरे मामले में, मुझे एक समाधान मिला, हालांकि एक अधूरा। मैं अपने पेड़ विजेट में क्रियाएं जोड़ रहा हूं, ताकि जब आप उस पर राइट क्लिक करेंगे, तो इन कार्रवाइयों के साथ एक पॉपअप दिखाई देता है। हालांकि, जब मैं अपने पेड़ विजेट में आइटम जोड़ता हूं और मैं उन पर राइट क्लिक करता हूं, वही पॉपअप प्रकट होता है। मैं क्या करना चाहता हूं कि जब आप पेड़ विजेट पर राइट क्लिक करते हैं, तो पेड़ विजेट पॉपअप मेनू प्रकट होता है और जब आप आइटम पर राइट क्लिक करते हैं, तो कोई अन्य संबंधित पॉपअप मेनू प्रकट होता है। क्या कोई जानता है कि यह कैसे करें?QTreeWidget राइट क्लिक मेनू

treeView->setContextMenuPolicy(Qt::CustomContextMenu); 

तो फिर तुम QWidget::customContextMenuRequested(const QPoint&) सिग्नल से कनेक्ट करने और अपने संदर्भ मेनू दिखा सकते हैं:

उत्तर

14

सबसे पहले आप कस्टम संदर्भ मेनू नीति निर्धारित करना चाहिए।

+0

ऐसा लगता है कि मैंने और अधिक जटिल पाया। तो व्यावहारिक रूप से मुझे अपने स्लॉट में customContextMenuRequested सिग्नल कनेक्ट करने की आवश्यकता है? – ISTB

+0

हां, आपके पास एक स्लॉट होना चाहिए जो उस सिग्नल को पकड़ने के बाद आपका कस्टम संदर्भ मेनू दिखाएगा। – hank

2

QAbstractItemModel ओवरलोडिंग पर एक नज़र डालें और अपना स्वयं का ऑनकॉन्टेक्स्टमेनू रिक्वेस्टेड प्रदान करें। इस फ़ंक्शन के माध्यम से आप विभिन्न संदर्भ मेनू बना सकते हैं।

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

हालांकि मॉडल में होने का कोई कारण नहीं है। यह दृश्य से संकेत है, जिसे मॉडल को आम तौर पर नहीं पता होना चाहिए। –

14

पहले, config QTreeWidget प्रतिक्रिया (फेंकना संकेत) सही माउस क्लिक करने के लिए:

treeWidget->setContextMenuPolicy(Qt::CustomContextMenu); 

दूसरा

यहाँ अपनी परियोजनाओं है कि सहायक हो सकता है में से एक से कुछ छोटा छद्म-ish कोड है , सिग्नल को अपने स्लॉट "मेनविंडो :: तैयारमेनू" से कनेक्ट करें:

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

तीसरा, संदर्भ मेनू बनाएं स्लॉट में:

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)); 
} 
संबंधित मुद्दे