在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();
三,按钮菜单
主要是用到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