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文件:
- private slots:
- void onGrpMenuTriggered(QAction *action);
- void onMemberMenuTriggered(QAction *action);
- void onAddAreaMenuTriggered(QAction *action);
- private:
- //grp menu
- QMenu *m_grpMenu;
- //child menu
- QMenu *m_memberMenu;
- QMenu *m_addAreaMenu;
- //grp action
- QAction *m_grpAddOneMember;
- QAction *m_grpDeleteGrp;
- QAction *m_grpAddOneGrp;
- //child action
- QAction *m_memberDelete;
- QAction *m_memberMove;
- QAction *m_memberSyncTime;
- //action
- QAction *m_addAreaAction;
- QAction *m_grpFlush;
- QAction *m_addDev;
- void createItemMenu(); //構造函數中調用此函數
cpp文件:
- void MainWindow::createItemMenu()
- {
- m_grpMenu = new QMenu(this);
- m_memberMenu = new QMenu(this);
- m_addAreaMenu = new QMenu(this);
- connect(m_grpMenu,SIGNAL(triggered(QAction *)),
- this,SLOT(onGrpMenuTriggered(QAction *)));
- connect(m_memberMenu,SIGNAL(triggered(QAction *)),
- this,SLOT(onMemberMenuTriggered(QAction *)));
- connect(m_addAreaMenu,SIGNAL(triggered(QAction *)),
- this,SLOT(onAddAreaMenuTriggered(QAction *)));
- m_grpAddOneMember = new QAction(tr("增加子區域"),this);
- m_grpAddOneMember->setIcon(QIcon(":/image/add.png"));
- m_grpAddOneGrp = new QAction(tr("增加設備"),this);
- m_grpAddOneGrp->setIcon(QIcon(":/image/add.png"));
- m_grpDeleteGrp = new QAction(tr("刪除區域"),this);
- m_grpDeleteGrp->setIcon(QIcon(":/image/delete.png"));
- m_memberDelete = new QAction(tr("刪除設備"),this);
- m_memberDelete->setIcon(QIcon(":/image/delete.png"));
- m_memberMove = new QAction(tr("移動設備"),this);
- m_memberMove->setIcon(QIcon(":/image/next.png"));
- m_memberSyncTime = new QAction(tr("同步時間"),this);
- m_memberSyncTime->setIcon(QIcon(":/image/move.png"));
- m_addAreaAction = new QAction(tr("增加區域"),this);
- m_addAreaAction->setIcon(QIcon(":/image/add.png"));
- m_addDev = new QAction(tr("增加設備"),this);
- m_addDev->setIcon(QIcon(":/image/add.png"));
- m_grpFlush = new QAction(tr("刷新列表"),this);
- m_grpFlush->setIcon(QIcon(":/image/update.png"));
- }
- //重構contextMenuEvent函數,記得#include <QContextMenuEvent>
- void MainWindow::contextMenuEvent(QContextMenuEvent *event)
- {
- QTreeWidgetItem *item = ui->treeWidget->currentItem();
- if(item == NULL)
- {
- qDebug()<<"空白處";
- if (m_addAreaMenu->isEmpty())
- {
- //增加區域
- m_addAreaMenu->addAction(m_addAreaAction);
- m_addAreaMenu->addAction(m_addDev);
- m_addAreaMenu->addAction(m_grpFlush);
- }
- //菜單出現的位置為當前鼠標的位置
- m_addAreaMenu->exec(QCursor::pos());
- }
- else if(ui->treeWidget->currentItem()->childCount() > 0)
- {
- if (m_grpMenu->isEmpty())
- {
- //增加子區域
- m_grpMenu->addAction(m_grpAddOneMember);
- //刪除區域
- m_grpMenu->addAction(m_grpDeleteGrp);
- m_grpMenu->addAction(m_grpAddOneGrp);
- }
- m_grpMenu->exec(QCursor::pos());
- }
- else if(ui->treeWidget->currentItem()->childCount() == 0)
- {
- if (m_memberMenu->isEmpty())
- {
- //刪除設備
- m_memberMenu->addAction(m_memberDelete);
- //移動設備
- m_memberMenu->addAction(m_memberMove);
- //同步時間
- m_memberMenu->addAction(m_memberSyncTime);
- }
- m_memberMenu->exec(QCursor::pos());
- }
- event->accept();
- }
- void MainWindow::onGrpMenuTriggered(QAction *action)
- {
- if (action == m_grpAddOneMember)
- {//增加子區域
- }
- else if (action == m_grpDeleteGrp)
- {//刪除區域
- }
- else if(action == m_grpAddOneGrp)
- {
- }
- }
- void MainWindow::onMemberMenuTriggered(QAction *action)
- {
- if (action == m_memberDelete)
- {//刪除設備
- }
- else if(action == m_memberMove)
- {//移動設備
- }
- else if(action == m_memberSyncTime)
- {//同步時間
- }
- }
- void MainWindow::onAddAreaMenuTriggered(QAction *action)
- {
- if (action == m_addAreaAction)
- {//增加區域
- }
- if(action == m_addDev)
- {//增加設備
- }
- if(action == m_grpFlush)
- {//刷新
- }
- }
樹型結構的基本用法:
- void MainWindow::createTreeWidget()
- {
- QIcon icon;
- icon.addPixmap(QPixmap(":/image/openStatus.png"), QIcon::Normal, QIcon::On);//節點打開狀態
- icon.addPixmap(QPixmap(":/image/closeStatus.png"), QIcon::Normal, QIcon::Off);//節點關閉狀態
- ui->treeWidget->setColumnCount(1);
- QStringList headers;
- headers << QObject::tr("管理");
- ui->treeWidget->setHeaderLabels(headers);
- QStringList rootName_1;
- rootName_1 << QObject::tr("常用文件夾");
- QTreeWidgetItem *rootItem_1 = new QTreeWidgetItem(ui->treeWidget, rootName_1);
- // rootItem_1->setIcon(0, QIcon(":/image/add.png")); //增加靜態圖標
- rootItem_1->setIcon(0,icon);
- QStringList childName_1_1;
- childName_1_1 << "所有未讀";
- QTreeWidgetItem *childItem_1_1 = new QTreeWidgetItem(rootItem_1, childName_1_1);
- rootItem_1->addChild(childItem_1_1);
- QStringList childName_1_2;
- childName_1_2 << QObject::tr("置頂郵件");
- QTreeWidgetItem *childItem_1_2 = new QTreeWidgetItem(rootItem_1, childName_1_2);
- rootItem_1->addChild(childItem_1_2);
- QStringList rootName_2;
- rootName_2 << QObject::tr("我的郵箱");
- QTreeWidgetItem *rootItem_2 = new QTreeWidgetItem(ui->treeWidget, rootName_2);
- rootItem_2->setIcon(0,icon);
- QStringList childName_2_1;
- childName_2_1 << QObject::tr("收件箱");
- QTreeWidgetItem *childItem_2_1 = new QTreeWidgetItem(rootItem_2, childName_2_1);
- rootItem_2->addChild(childItem_2_1);
- QStringList childName_2_2;
- childName_2_2 << QObject::tr("草稿箱");
- QTreeWidgetItem *childItem_2_2 = new QTreeWidgetItem(rootItem_2, childName_2_2);
- rootItem_2->addChild(childItem_2_2);
- QStringList childName_2_3;
- childName_2_3 << QObject::tr("發件箱");
- QTreeWidgetItem *childItem_2_3 = new QTreeWidgetItem(rootItem_2, childName_2_3);
- rootItem_2->addChild(childItem_2_3);
- ui->treeWidget->addTopLevelItem(rootItem_1);
- ui->treeWidget->addTopLevelItem(rootItem_2);
- QStringList childName_1_2_1;
- childName_1_2_1 << "測試";
- QTreeWidgetItem *childItem_1_2_1 = new QTreeWidgetItem(childItem_1_2, childName_1_2_1);
- childItem_1_2->addChild(childItem_1_2_1);
- }
另一篇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
