在Qt的開發過程中,菜單的操作時非常有用的,相信這個就不必過多介紹啦!用慣了window的是再熟悉不過啦!特別是喜歡刷新的夥伴們。那這個是怎麼實現的呢?在這裏我要通過我對這個的認識來進行講解。
一,右鍵菜單
首先第一點:這個菜單是怎麼來的,裏面的內容是怎麼寫上去的,還有就是爲什麼你叫它刷新,它就給你刷新,不給你乾點別的,這些都是菜單方向的困惑;
第二點:爲什麼是右鍵的菜單,還有就是菜單的位置是怎麼確定的,這是對菜單的顯示的困惑;
第三點:還有感覺比較神奇的是爲什麼針對不同的對象,它的菜單項是不一樣的呢?,很困惑。。。。。。。
第四點:爲什麼有些菜單這麼漂亮,有一些屬於真心看不下去的呢?怎麼讓菜單好看點;
困惑每個人都會有,但是我想要說的是,你有這麼多的困惑,你試圖去解開它嗎?這個纔是最重要的。
ok,讓我們來把困惑一個一個的搞定。
菜單是怎麼來的,對於Qt來說,它使用的是QMenu和QAction兩者。
QMenu *mainMenu = new QMenu(); //這樣我們就創建了一個菜單
有了菜單我們還需要我們的菜單項,這樣我們就可以更加方便的使用和認識菜單的用途啦!對於菜單項我們使用的是QAction
QAction *delete_action = new QAction(mainMenu); //刪除操作
QAction *copy_action = new QAction(mainMenu); //複製操作
QAction *stick_action = new QAction(mainMenu); //黏貼操作
ok現在我們有了菜單項,當時我們看到一搬的菜單都有一些文字描述比如:刷新,複製,粘貼;
所以我們也要給我們的菜單項增加描述:
delete_action->setText("刪除操作");
copy_action->setText("複製操作");
stick_action->setText("黏貼操作");
當然爲了讓你的菜單更好看點,你可以給你的菜單項增加圖標;
delete_action->setIcon(QIcon(QString fileName)); //這樣你的菜單項就會多一個圖標。
現在我們看到我們的菜單和菜單項屬於兩個不同的整體,不符合我們的要求,而且說實話看不到什麼效果。
所以現在我們需要的是把菜單和菜單項給整合在一起,先讓我們的菜單露個臉纔行,要不然什麼都白搭!
mainMenu->addAction(delete_action);
mainMenu->addAction(copy_action);
mainMenu->addAction(stick_action);
ok,現在我們已經整合完畢啦!接下來我們就需要讓我們的菜單顯示啦!
對於右鍵菜單的顯示,我們利用的是
void contextMenuEvent(QContextMenuEvent *event);
{
mainMenu->exec(QCursor::pos()); //這樣菜單纔會出現在光標點擊的位置
event->accept();
}
ok,現在我們可以知道,當你運行這個程序的時候,我們的菜單出現啦!但是當你單擊其中的一個菜單項的時候,發現什麼東東都沒有發生,所以我們應該給我們的菜單項添加相對應得操作,這樣我們的菜單纔會實用起來。ok,開動!
構建相對應得信號和槽的操作
connect(delete_action,SIGNAL(triggered()),this,SLOT(OnDeleteAction()));
connect(copy_action,SIGNAL(triggered(),this,SLOT(OnCopyAction())));
connect(stick_action,SIGNAL(triggered(),this,SLOT(OnStickAction())));
然後我們需要做的就是將我們的槽實現起來,做你想做的事情!這樣右鍵菜單的操作,就ok 啦!
這就是爲什麼你點刷新的時候它不會給你幹其他事情的原因啦!
還有就是爲什麼這是右鍵菜單呢?而不是左鍵菜單的根本原因是contextMenuEvent這個事件,中的描述
for example, on Windows, pressing the menu
button or clicking the right mouse button will cause this event to be sent.
通過這個在QT幫助文檔中的字,相信你也已經明白,爲什麼是右鍵纔會出現這個菜單了吧!
二,托盤菜單
這個右鍵菜單最大的不同是它不需要處理contextMenuEvent,而是用Qt自帶的托盤類中的函數來處理的;
ok,話不多說直接上代碼:
homeAction = new QAction(this);
quitAction = new QAction(this);
aboutAction = new QAction(this);
helpAction = new QAction(this);
openAction = new QAction(this);
homeAction->setIcon(QIcon(":/images/home"));
quitAction->setIcon(QIcon(":/images/quit"));
aboutAction->setIcon(QIcon(":/images/about"));
helpAction->setIcon(QIcon(":/images/help"));
openAction->setIcon(QIcon(":/images/open"));
homeAction->setText(tr("主頁"));
aboutAction->setText(tr("關於"));
helpAction->setText(tr("幫助"));
openAction->setText(tr("打開"));
quitAction->setText(tr("退出"));
//系統菜單
trayMenu->addAction(homeAction);
trayMenu->addAction(quitAction);
trayMenu->addAction(aboutAction);
trayMenu->addAction(helpAction);
trayMenu->addAction(openAction);
trayIcon = new QSystemTrayIcon();
trayIcon->setToolTip(tr("我的系統托盤"));
trayIcon->setIcon(QIcon(":/images/home"));
trayIcon->setContextMenu(trayMenu);
trayIcon->show();
ok,這樣就搞定啦!具體動作的話用信號連接處理就搞定啦!
三,按鈕菜單
主要是用到button的setMenu這個函數
直接上代碼:
menuButton = new QPushButton(this);
menuButton->setFixedSize(78,30);
buttonMenu = new QMenu();
//對於我們的菜單,很有必要對它的樣式進行設計這需要用到我們的QSS
buttonMenu->setStyleSheet("QMenu{background:white;border:1px solid gray;padding:5px}"
"QMenu::item{padding:0px 40px 0px 30px;height:25px}"
"QMenu::item:selected{background:lightblue;color:white;}"
"QMenu::separator{height:1px ;background:lightgray;margin:5px,0px,5px,0px;}");
deleteAction = new QAction(buttonMenu);
addAction = new QAction(buttonMenu);
deleteAction->setIcon(QIcon(":/images/help"));
addAction->setIcon(QIcon(":/images/about"));
buttonMenu->addAction(deleteAction);
buttonMenu->addSeparator();
buttonMenu->addAction(addAction);
menuButton->setMenu(buttonMenu);
關於菜單操作的demo我已經上傳,裏面包含系統菜單,按鈕菜單,右鍵菜單http://download.csdn.net/detail/lmzqm/6766091