qt之菜单项定制
2016-07-02 01:01
246 查看
qt实现菜单,简单的界面QMenu+QAction完全可以实现,在加上qss的支持,可以定制出比较美观的菜单,qt的菜单一般用在托盘、按钮和工具栏上。
当然啦,也有很多软件有比较美观的托盘菜单,比如360、电脑管家等软件,效果图如图1所示,其实qt在4.2之后也提供了定制菜单的功能,使用QWidgetAction可以定制出自己想要的菜单来,接下来是我定制菜单栏的步骤。
View Code
因为菜单是一个QWidget,在构造函数中,拿不到width和height,而在show的时候可以拿到相关信息,代码如下:
讲到这儿,qt菜单定制功能就讲完了,在菜单定制的过程中我自己也遇到了一些问题,在此记录下,希望看到并知道原因的留下您的脚印。
问题:
1、定制的QWidget中的鼠标事件异常
2、qss中的属性判断异常,例如QLabel[IsCheck=true]{border:1 solid #ff0000;},这种方式设置的鼠标变化不起作用,为了实现这个功能,我是在CSystemTrayIcon类中把定制窗口事件都注册到父类中,然后通过eventFilter来判断鼠标位置,进一步重新设置qss来到达鼠标移动换背景色的功能。代码如下:
当然啦,也有很多软件有比较美观的托盘菜单,比如360、电脑管家等软件,效果图如图1所示,其实qt在4.2之后也提供了定制菜单的功能,使用QWidgetAction可以定制出自己想要的菜单来,接下来是我定制菜单栏的步骤。
class CTrayMenu : public QMenu { Q_OBJECT signals: void FixedPostion();//移动菜单位置 public: CTrayMenu(QWidget * parent = nullptr); ~CTrayMenu(); protected: virtual bool event(QEvent *) Q_DECL_OVERRIDE; };
View Code
因为菜单是一个QWidget,在构造函数中,拿不到width和height,而在show的时候可以拿到相关信息,代码如下:
bool CTrayMenu::event(QEvent * e) { if (e->type() == QEvent::Show) { emit FixedPostion(); } return QMenu::event(e); }
讲到这儿,qt菜单定制功能就讲完了,在菜单定制的过程中我自己也遇到了一些问题,在此记录下,希望看到并知道原因的留下您的脚印。
问题:
1、定制的QWidget中的鼠标事件异常
2、qss中的属性判断异常,例如QLabel[IsCheck=true]{border:1 solid #ff0000;},这种方式设置的鼠标变化不起作用,为了实现这个功能,我是在CSystemTrayIcon类中把定制窗口事件都注册到父类中,然后通过eventFilter来判断鼠标位置,进一步重新设置qss来到达鼠标移动换背景色的功能。代码如下:
bool CSystemTrayIcon::eventFilter(QObject * watched, QEvent * event) { if (watched == this) { m_MouseLeave = false; } if (watched->inherits("QWidget") && event->type() == QEvent::Paint) { if (CActionContentWidget * actionItem = static_cast<CActionContentWidget *>(watched)) { if (actionItem->rect().contains(actionItem->mapFromGlobal(QCursor::pos()))) { actionItem->SetBackgroundRole(true); } else { actionItem->SetBackgroundRole(false); } } } return QSystemTrayIcon::eventFilter(watched, event); }
相关文章推荐
- Compiling Qt 5.5.1 (With Qtwebkit) With Visual Studio 2015
- OpenCV学习笔记(一)(Linux + Qt)
- SLAM - 利用Qt绘制灰度地图
- 迁移到MSYS2 与 Qt 工具链注意的几个事情(注意链接顺序,并且人造mingw工具链所没有的局部midl.exe命令)
- 迁移 Qt4 至 Qt5 的几个主要环节(数据库插件别拷错了地方)
- Qt 多线程与数据库操作需要注意的几点问题(QSqlDatabase对象只能在当前线程里使用)
- 一种基于Qt的可伸缩的全异步C/S架构服务器实现(流浪小狗,六篇,附下载地址)
- QT5中文显示
- Qt---多线程的简单实现
- Qt---快速建立对话框
- Qt之字典划词
- Qt之字典划词
- Qt Style Sheet实践(三):QCheckBox和QRadioButton
- QT生成PDF
- Qt之滚动字幕
- Qt之滚动字幕
- pyqt5 笔记(四)cx_Freeze 实现代码打包exe
- QT显示歌词渐变
- Qt:程序桌面图标生成
- qt-creator源码研究2