2013-01-09 12 views
9

Mi sono guardato intorno e sembra che il problema sia presente non solo per il widget dell'albero ma anche per altri widget. Ma nel mio caso, ho trovato una soluzione, anche se incompleta. Sto aggiungendo le azioni al mio albero widget, in modo che quando si fa clic con il pulsante destro su di esso, viene visualizzato un popup con queste azioni. Tuttavia, quando aggiungo elementi al mio albero widget e faccio clic destro su di essi, appare lo stesso popup. Quello che vorrei fare è che quando fai clic con il pulsante destro del mouse sul widget dell'albero, viene visualizzato un menu a comparsa del widget dell'albero e quando fai clic con il pulsante destro del mouse sugli elementi, viene visualizzato un altro menu popup corrispondente. Qualcuno sa come fare questo?QTreeWidget tasto destro del menu di scelta

risposta

14

primo luogo si dovrebbe impostare personalizzato politica menu contestuale:

treeView->setContextMenuPolicy(Qt::CustomContextMenu); 

quindi è possibile collegare al segnale QWidget::customContextMenuRequested(const QPoint&) e mostrare il proprio menu di contesto.

+0

Sembra più complicato di quanto pensassi. Quindi, praticamente ho bisogno di collegare il segnale CustomContextMenuRequested al mio slot? – ISTB

+0

Sì, dovresti avere uno slot che mostrerà il tuo menu di scelta rapida personalizzato dopo aver catturato quel segnale. – hank

2

Dai un'occhiata a sovraccaricare QAbstractItemModel e fornire il tuo OnContextMenuRequested. Tramite questa funzione è possibile avere diversi elementi per creare diversi menu contestuali.

Ecco alcuni pseudo-codice-ish accorciato da uno dei miei progetti che possono essere utili:

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

Non c'è motivo per questo di essere nel modello però. È un segnale dalla vista, di cui in genere il modello non dovrebbe essere a conoscenza. –

14

In primo luogo, config QTreeWidget alla risposta (emettere segnale) tasto destro del mouse:

treeWidget->setContextMenuPolicy(Qt::CustomContextMenu); 

Seconda , collegare il segnale con la slot "MainWindow :: prepareMenu":

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

In terzo luogo, creare menu contestuale nello slot:

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