Qt 菜單操作詳解

在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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章