2013-01-09 144 views
9

我环顾四周,似乎问题不仅出现在树形部件中,而且也出现在其他小部件上。但就我而言,我找到了一个解决方案,尽管是一个不完整的方案。我将操作添加到我的树部件中,以便在右键单击它时出现一个包含这些操作的弹出窗口。但是,当我将项目添加到我的树窗口小部件中并右键单击它们时,会出现相同的弹出窗口。 我想要做的是,当您右键单击树窗口小部件时,会出现一个树窗口小部件弹出菜单,当您右键单击项目时,会出现另一个相应的弹出式菜单。有谁知道如何做到这一点?QTreeWidget右键菜单

回答

14

首先,你应该设置自定义快捷菜单政策:

treeView->setContextMenuPolicy(Qt::CustomContextMenu); 

然后你就可以连接到QWidget::customContextMenuRequested(const QPoint&)信号,并显示您的上下文菜单。

+0

这似乎是更复杂,我打了。所以实际上我需要将customContextMenuRequested信号连接到我的插槽? – ISTB

+0

是的,您应该有一个插槽,在捕获该信号后显示您的自定义上下文菜单。 – hank

2

看看重载QAbstractItemModel并提供您自己的OnContextMenuRequested。通过此功能,您可以让不同的项目创建不同的上下文菜单。

下面是我的项目可能会有所帮助的一个部分缩短伪ISH代码:

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

首先,配置QTreeWidget到响应(发出信号),单击鼠标右键:

treeWidget->setContextMenuPolicy(Qt::CustomContextMenu); 

二,将信号与插槽“MainWindow :: prepareMenu”连接起来:

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