在TreeWidget中增加右鍵菜單功能 以及TreeWidget的基本用法


TreeWidget 與 TreeView 中實現右鍵菜單稍有不同,

TreeView 中是靠信號與槽 

connect(ui->treeView,SIGNAL(customContextMenuRequested(constQPoint&)), this,SLOT(onCustomContextMenuRequested(constQPoint&)));

實現TreeView內不同地方的右鍵菜單,文章見 http://blog.csdn.net/liukang325/article/details/22734735

TreeWidget 中是靠重構 contextMenuEvent(QContextMenuEvent*event)  函數實現不同地方的不同右鍵菜單的。具體代碼如下:

 

h文件:

 

[cpp]  view plain  copy
 
 在CODE上查看代碼片派生到我的代碼片
  1. private slots:  
  2.   
  3.     void onGrpMenuTriggered(QAction *action);  
  4.     void onMemberMenuTriggered(QAction *action);  
  5.     void onAddAreaMenuTriggered(QAction *action);  
  6.   
  7. private:  
  8.     //grp menu  
  9.     QMenu *m_grpMenu;  
  10.     //child menu  
  11.     QMenu *m_memberMenu;  
  12.     QMenu *m_addAreaMenu;  
  13.   
  14.     //grp action  
  15.     QAction *m_grpAddOneMember;  
  16.     QAction *m_grpDeleteGrp;  
  17.     QAction *m_grpAddOneGrp;  
  18.     //child action  
  19.     QAction *m_memberDelete;  
  20.     QAction *m_memberMove;  
  21.     QAction *m_memberSyncTime;  
  22.     //action  
  23.     QAction *m_addAreaAction;  
  24.     QAction *m_grpFlush;  
  25.     QAction *m_addDev;  
  26.   
  27.     void createItemMenu(); //構造函數中調用此函數  


cpp文件:

 

 

[cpp]  view plain  copy
 
 在CODE上查看代碼片派生到我的代碼片
  1. void MainWindow::createItemMenu()  
  2. {  
  3.     m_grpMenu = new QMenu(this);  
  4.     m_memberMenu = new QMenu(this);  
  5.     m_addAreaMenu = new QMenu(this);  
  6.     connect(m_grpMenu,SIGNAL(triggered(QAction *)),  
  7.             this,SLOT(onGrpMenuTriggered(QAction *)));  
  8.     connect(m_memberMenu,SIGNAL(triggered(QAction *)),  
  9.             this,SLOT(onMemberMenuTriggered(QAction *)));  
  10.     connect(m_addAreaMenu,SIGNAL(triggered(QAction *)),  
  11.             this,SLOT(onAddAreaMenuTriggered(QAction *)));  
  12.   
  13.     m_grpAddOneMember = new QAction(tr("增加子區域"),this);  
  14.     m_grpAddOneMember->setIcon(QIcon(":/image/add.png"));  
  15.     m_grpAddOneGrp = new QAction(tr("增加設備"),this);  
  16.     m_grpAddOneGrp->setIcon(QIcon(":/image/add.png"));  
  17.     m_grpDeleteGrp = new QAction(tr("刪除區域"),this);  
  18.     m_grpDeleteGrp->setIcon(QIcon(":/image/delete.png"));  
  19.   
  20.     m_memberDelete = new QAction(tr("刪除設備"),this);  
  21.     m_memberDelete->setIcon(QIcon(":/image/delete.png"));  
  22.     m_memberMove = new QAction(tr("移動設備"),this);  
  23.     m_memberMove->setIcon(QIcon(":/image/next.png"));  
  24.     m_memberSyncTime = new QAction(tr("同步時間"),this);  
  25.     m_memberSyncTime->setIcon(QIcon(":/image/move.png"));  
  26.   
  27.     m_addAreaAction = new QAction(tr("增加區域"),this);  
  28.     m_addAreaAction->setIcon(QIcon(":/image/add.png"));  
  29.     m_addDev = new QAction(tr("增加設備"),this);  
  30.     m_addDev->setIcon(QIcon(":/image/add.png"));  
  31.     m_grpFlush = new QAction(tr("刷新列表"),this);  
  32.     m_grpFlush->setIcon(QIcon(":/image/update.png"));  
  33. }  
  34.   
  35. //重構contextMenuEvent函數,記得#include <QContextMenuEvent>  
  36. void MainWindow::contextMenuEvent(QContextMenuEvent *event)  
  37. {  
  38.     QTreeWidgetItem *item = ui->treeWidget->currentItem();  
  39.     if(item == NULL)  
  40.     {  
  41.         qDebug()<<"空白處";  
  42.         if (m_addAreaMenu->isEmpty())  
  43.         {  
  44.             //增加區域  
  45.             m_addAreaMenu->addAction(m_addAreaAction);  
  46.             m_addAreaMenu->addAction(m_addDev);  
  47.             m_addAreaMenu->addAction(m_grpFlush);  
  48.         }  
  49.         //菜單出現的位置為當前鼠標的位置  
  50.         m_addAreaMenu->exec(QCursor::pos());  
  51.     }  
  52.     else if(ui->treeWidget->currentItem()->childCount() > 0)  
  53.     {  
  54.         if (m_grpMenu->isEmpty())  
  55.         {  
  56.             //增加子區域  
  57.             m_grpMenu->addAction(m_grpAddOneMember);  
  58.             //刪除區域  
  59.             m_grpMenu->addAction(m_grpDeleteGrp);  
  60.             m_grpMenu->addAction(m_grpAddOneGrp);  
  61.         }  
  62.         m_grpMenu->exec(QCursor::pos());  
  63.     }  
  64.     else if(ui->treeWidget->currentItem()->childCount() == 0)  
  65.     {  
  66.   
  67.         if (m_memberMenu->isEmpty())  
  68.         {  
  69.             //刪除設備  
  70.             m_memberMenu->addAction(m_memberDelete);  
  71.             //移動設備  
  72.             m_memberMenu->addAction(m_memberMove);  
  73.             //同步時間  
  74.             m_memberMenu->addAction(m_memberSyncTime);  
  75.         }  
  76.         m_memberMenu->exec(QCursor::pos());  
  77.     }  
  78.   
  79.     event->accept();  
  80. }  
  81.   
  82. void MainWindow::onGrpMenuTriggered(QAction *action)  
  83. {  
  84.     if (action == m_grpAddOneMember)  
  85.     {//增加子區域  
  86.   
  87.     }  
  88.     else if (action == m_grpDeleteGrp)  
  89.     {//刪除區域  
  90.   
  91.     }  
  92.     else if(action == m_grpAddOneGrp)  
  93.     {  
  94.   
  95.     }  
  96. }  
  97.   
  98. void MainWindow::onMemberMenuTriggered(QAction *action)  
  99. {  
  100.     if (action == m_memberDelete)  
  101.     {//刪除設備  
  102.   
  103.     }  
  104.     else if(action == m_memberMove)  
  105.     {//移動設備  
  106.   
  107.     }  
  108.     else if(action == m_memberSyncTime)  
  109.     {//同步時間  
  110.   
  111.     }  
  112. }  
  113.   
  114. void MainWindow::onAddAreaMenuTriggered(QAction *action)  
  115. {  
  116.     if (action == m_addAreaAction)  
  117.     {//增加區域  
  118.   
  119.     }  
  120.     if(action == m_addDev)  
  121.     {//增加設備  
  122.   
  123.     }  
  124.     if(action == m_grpFlush)  
  125.     {//刷新  
  126.   
  127.     }  
  128. }  

 

 

樹型結構的基本用法:

 

[cpp]  view plain  copy
 
 在CODE上查看代碼片派生到我的代碼片
  1. void MainWindow::createTreeWidget()  
  2. {  
  3.     QIcon icon;  
  4.     icon.addPixmap(QPixmap(":/image/openStatus.png"), QIcon::Normal, QIcon::On);//節點打開狀態  
  5.     icon.addPixmap(QPixmap(":/image/closeStatus.png"), QIcon::Normal, QIcon::Off);//節點關閉狀態  
  6.   
  7.     ui->treeWidget->setColumnCount(1);  
  8.     QStringList headers;  
  9.     headers << QObject::tr("管理");  
  10.     ui->treeWidget->setHeaderLabels(headers);  
  11.   
  12.     QStringList rootName_1;  
  13.     rootName_1 << QObject::tr("常用文件夾");  
  14.     QTreeWidgetItem *rootItem_1 = new QTreeWidgetItem(ui->treeWidget, rootName_1);  
  15.    // rootItem_1->setIcon(0, QIcon(":/image/add.png")); //增加靜態圖標  
  16.     rootItem_1->setIcon(0,icon);  
  17.   
  18.   
  19.     QStringList childName_1_1;  
  20.     childName_1_1 << "所有未讀";  
  21.     QTreeWidgetItem *childItem_1_1 = new QTreeWidgetItem(rootItem_1, childName_1_1);  
  22.   
  23.     rootItem_1->addChild(childItem_1_1);  
  24.   
  25.     QStringList childName_1_2;  
  26.     childName_1_2 << QObject::tr("置頂郵件");  
  27.     QTreeWidgetItem *childItem_1_2 = new QTreeWidgetItem(rootItem_1, childName_1_2);  
  28.   
  29.     rootItem_1->addChild(childItem_1_2);  
  30.   
  31.     QStringList rootName_2;  
  32.     rootName_2 << QObject::tr("我的郵箱");  
  33.     QTreeWidgetItem *rootItem_2 = new QTreeWidgetItem(ui->treeWidget, rootName_2);  
  34.   
  35.     rootItem_2->setIcon(0,icon);  
  36.   
  37.     QStringList childName_2_1;  
  38.     childName_2_1 << QObject::tr("收件箱");  
  39.     QTreeWidgetItem *childItem_2_1 = new QTreeWidgetItem(rootItem_2, childName_2_1);  
  40.   
  41.     rootItem_2->addChild(childItem_2_1);  
  42.   
  43.     QStringList childName_2_2;  
  44.     childName_2_2 << QObject::tr("草稿箱");  
  45.     QTreeWidgetItem *childItem_2_2 = new QTreeWidgetItem(rootItem_2, childName_2_2);  
  46.   
  47.     rootItem_2->addChild(childItem_2_2);  
  48.   
  49.     QStringList childName_2_3;  
  50.     childName_2_3 << QObject::tr("發件箱");  
  51.     QTreeWidgetItem *childItem_2_3 = new QTreeWidgetItem(rootItem_2, childName_2_3);  
  52.   
  53.     rootItem_2->addChild(childItem_2_3);  
  54.   
  55.     ui->treeWidget->addTopLevelItem(rootItem_1);  
  56.     ui->treeWidget->addTopLevelItem(rootItem_2);  
  57.   
  58.   
  59.     QStringList childName_1_2_1;  
  60.     childName_1_2_1 << "測試";  
  61.     QTreeWidgetItem *childItem_1_2_1 = new QTreeWidgetItem(childItem_1_2, childName_1_2_1);  
  62.     childItem_1_2->addChild(childItem_1_2_1);  
  63.   
  64. }  

另一篇TreeWidget 的用法,更加清晰明了的實現樹狀結構:http://blog.csdn.net/liukang325/article/details/13768523

補充:

childItem_1_2_1->setForeground(0,QBrush(QColor(Qt::blue)));

// 可將某一項的字體變顏色!

http://blog.csdn.net/liukang325/article/details/23694585


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM