qt实现菜单,简单的界面QMenu+QAction完全可以实现,在加上qss的支持,可以定制出比较美观的菜单,qt的菜单一般用在托盘、按钮和工具栏上。

    当然啦,也有很多软件有比较美观的托盘菜单,比如360、电脑管家等软件,效果图如图1所示,其实qt在4.2之后也提供了定制菜单的功能,使用QWidgetAction可以定制出自己想要的菜单来,接下来是我定制菜单栏的步骤。

qt之菜单项定制

图1 360图盘菜单

 

    实现效果如下图2所示,菜单是由单个条目组成的,每一个条目又由左右两部分组成,左边是一个图标,并伴有底色,右边是一个label,上边有文字描述,当有鼠标移动到项上时,项整个背景色变成红色,并且图标会替换,文字颜色也会有相应的变化。

qt之菜单项定制

图2 定制菜单

 

    首先拿到这个功能,我们可以先考虑功能的拆分,既然qt支持菜单项的窗口定制功能,那我们不防把每一个项目定制成一个QWidget,这样就问题就变成了一个窗口的定制,这样看起来是不是简单多了。

    首先我们来看下QSystemTrayIcon类,该类实现了windows托盘的功能,activated信号表示托盘图标有事件,我们需要处理这个信号,当messageClicked信号触发时,说明我们点击了托盘提示信息。下面是我重写的托盘类

 1 class CSystemTrayIcon : public QSystemTrayIcon
 2 {
 3     Q_OBJECT
 4 
 5 signals:
 6     void ShowMainWidget();
 7     void ShowMiniWidget();
 8     void AppQuit();
 9 
10 public:
11     CSystemTrayIcon(const QIcon & icon, QObject * parent = nullptr);
12     ~CSystemTrayIcon();
13 
14 public:
15     void SetWaverable(bool waver);//托盘图标是否闪动
16     void ShowMessage(const QString & title
17         , const QString & message
18         , QSystemTrayIcon::MessageIcon icon = QSystemTrayIcon::Information
19         , int millisecondsTimeoutHint = 5000);//托盘弹出气泡提示
20 
21     QAction * AddAction(const QString & actName, const QIcon & icon);
22 
23 protected:
24     virtual bool event(QEvent *) Q_DECL_OVERRIDE;
25     virtual void timerEvent(QTimerEvent *) Q_DECL_OVERRIDE;
26     virtual bool eventFilter(QObject * watched, QEvent * event) Q_DECL_OVERRIDE;
27 
28 private slots:
29     void TrayActivateSlot(QSystemTrayIcon::ActivationReason);
30     void MessageClickedSlot();
31 
32 private:
33     void CreateMenu();
34 
35 private:
36     bool m_MouseLeave = true;
37     int m_TimeID = 0;
38     QIcon m_IconPath;
39     CTrayMenu * m_Menu = nullptr;
40 #ifdef CustomAction
41     //添加定制菜单项
42     CActionItem * mainAct = nullptr;
43     CActionItem * miniAct = nullptr;
44     CActionItem * exitAct = nullptr;
45 #else
46     QAction * mainAct = nullptr;
47     QAction * miniAct = nullptr;
48     QAction * exitAct = nullptr;
49 #endif
50 };
View Code

相关文章:

  • 2022-12-23
  • 2021-12-28
  • 2022-12-23
  • 2021-05-13
  • 2021-11-21
  • 2021-11-12
猜你喜欢
  • 2022-12-23
  • 2021-11-04
  • 2022-12-23
  • 2022-12-23
  • 2021-08-16
  • 2022-12-23
  • 2022-12-23
相关资源
相似解决方案