VS2012+QT5.2 ,沒有ui,純代碼實現右鍵
方法一:常規但略麻煩
1、頭文件slot中聲明
QTreeWidget *tree;
void showrightMenu(QPoint);//顯示樹目錄右鍵菜單
2、源文件中
tree = new QTreeWidget;
tree->setHeaderHidden(true);//隱藏樹的標題欄
tree->setContextMenuPolicy(Qt::CustomContextMenu);//右鍵 不可少否則右鍵無反應
connect(tree,SIGNAL(customContextMenuRequested(QPoint)),this,SLOT(showrightMenu(QPoint)));
並實現槽函數
void classname::showrightMenu(QPoint point)
{
popMenu->clear();//清除原有菜單
popMenu->addAction(expandallAction);//如果放這是全局都有的右鍵
popMenu->addAction(foldedallAction);
//QTreeWidgetItem *item = tree->itemAt(point); //可得到右鍵條目
popMenu->exec(QCursor::pos());
}
其中expandallAction、foldedallAction及其方法的實現都是和菜單的一樣如下:
聲明:
QAction *expandallAction;
QAction *expandoneAction;
void expandalltreeItem();//右鍵展開所有樹的條目
void foldedalltreeItem();//右鍵折疊所有樹的條目
實現:
popMenu = new QMenu(this);
expandallAction = new QAction(QStringLiteral("展開全部"),this);
expandallAction->setStatusTip(QStringLiteral("展開全部"));
foldedallAction = new QAction(QStringLiteral("折疊全部"),this);
foldedallAction->setStatusTip(QStringLiteral("折疊全部"));
connect(expandallAction,SIGNAL(triggered()),this,SLOT(expandalltreeItem()));
connect(foldedallAction,SIGNAL(triggered()),this,SLOT(foldedalltreeItem()));
void classname::expandalltreeItem()
{
tree->expandAll();
}
void classname::foldedalltreeItem()
{
tree->collapseAll();
}
方法二 簡單有效
聲明void contextMenuEvent ( QContextMenuEvent * event ); //右鍵坐標定位
實現:
void classname::contextMenuEvent(QContextMenuEvent * event )
{
popMenu->clear();//清除原有菜單
popMenu->addAction(expandallAction);//如果放這是全局都有的右鍵
popMenu->addAction(foldedallAction);
QPoint point = event->pos();//得到鼠標的位置全局坐標
QTreeWidgetItem *item = tree->itemAt(point);
popMenu->exec(QCursor::pos());//菜單出現的位置為當前鼠標的位置
event->accept();
}
其中expandallAction、foldedallAction及其方法的實現如上
區別:方法一的右鍵有效區為tree,也就是目錄區,方法二右鍵的有效區為全部屏幕