Qt 菜单操作详解

来源:互联网 发布:花生壳软件下载 编辑:程序博客网 时间:2024/05/08 19:13

在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

0 0
原创粉丝点击