本文主要涉及以下三個類:
QAction可稱為動作類,它一般可當作菜單中的項組成菜單,也可作為工具欄上的按鈕,它主要由圖標、文本及快捷鍵三部分組成。QActionGroup用於將QAction分組,設置組內各QAction的互斥性質(exclusive ),設置后,組內的動作,在外觀上形成多選框(不互斥)或單選框(互斥)。QWidgetAction繼承自QAction,它可將自定義的小部件插入到菜單項中,用於QSystemTrayIcon(托盤圖標)的右鍵菜單似乎很合適。
公有函數如下:
QAction(QObject * parent)
QAction(const QString & text, QObject * parent)
QAction(const QIcon & icon, const QString & text, QObject * parent)
~QAction()
void setText(const QString & text)//設置文本
void setSeparator(bool b)//設成分割線,為深灰色的線,用於分割功能區
void setStatusTip(const QString & statusTip)//鼠標放至圖標上時,狀態欄提示文本
void setToolTip(const QString & tip)//鼠標放到上方時顯示的提示文本
void setWhatsThis(const QString & what)
void setIcon(const QIcon & icon)//設置圖標
void setIconText(const QString & text)//如果沒有setText(),則這個會顯示
void setIconVisibleInMenu(bool visible)//默認圖標在菜單中是可見的
void setMenu(QMenu * menu)//本action形成右方有小箭頭的子菜單
void setMenuRole(MenuRole menuRole)//菜單角色設定,由於Mac OS X系統的一些特性,Qt 會對一些菜單項進行自動排列。比如,如果你的菜單是“關於”、“設置”、“首選項”、“退出”等等,我們可以給它們分配一個角色,Qt 則會根據這些角色對菜單項的順序作出正確的排列。枚舉值見1
void setCheckable(bool)//設置是否可以勾選
void setData(const QVariant & userData)//
void setFont(const QFont & font)
void setPriority(Priority priority)//設置優先級,該優先級用於表明action在用戶界面上的優先級。如,當工具欄設置了Qt::ToolButtonTextBesideIcon模式,那么低優先級的actions將不會顯示出標簽。枚舉值見2
void setActionGroup(QActionGroup * group)//將本動作添加到某組
void setAutoRepeat(bool)//當長按快捷鍵時,是否不斷觸發,默認是
void setShortcut(const QKeySequence & shortcut)//設置快捷鍵
void setShortcutContext(Qt::ShortcutContext context)
void setShortcuts(const QList<QKeySequence> & shortcuts)
void setShortcuts(QKeySequence::StandardKey key)
QActionGroup * actionGroup() const
void activate(ActionEvent event)
QList<QGraphicsWidget *> associatedGraphicsWidgets() const
QList<QWidget *> associatedWidgets() const
bool autoRepeat() const
QVariant data() const
QFont font() const
QIcon icon() const
QString iconText() const
bool isCheckable() const
bool isChecked() const
bool isEnabled() const
bool isIconVisibleInMenu() const
bool isSeparator() const
bool isVisible() const
QMenu * menu() const
MenuRole menuRole() const
QWidget * parentWidget() const
Priority priority() const
QKeySequence shortcut() const
Qt::ShortcutContext shortcutContext() const
QList<QKeySequence> shortcuts() const
bool showStatusText(QWidget * widget = 0)
QString statusTip() const
QString text() const
QString toolTip() const
QString whatsThis() const
Public Slots
| void | hover() |
| void | setChecked(bool)//只有設為true,才能選中 |
| void | setDisabled(bool b) |
| void | setEnabled(bool) |
| void | setVisible(bool) |
| void | toggle() |
| void | trigger() |
Signals
| void | changed() |
| void | hovered() |
| void | toggled(bool checked)//切換 |
| void | triggered(bool checked = false)//觸發 |
1,enum QAction::MenuRole
| Constant | Value | Description |
|---|---|---|
| QAction::NoRole | 0 | This action should not be put into the application menu |
| QAction::TextHeuristicRole | 1 | This action should be put in the application menu based on the action's text as described in the QMenuBar documentation. |
| QAction::ApplicationSpecificRole | 2 | This action should be put in the application menu with an application specific role |
| QAction::AboutQtRole | 3 | This action matches handles the "About Qt" menu item. |
| QAction::AboutRole | 4 | This action should be placed where the "About" menu item is in the application menu. The text of the menu item will be set to "About <application name>". The application name is fetched from the Info.plistfile in the application's bundle (See Deploying an Application on Mac OS X). |
| QAction::PreferencesRole | 5 | This action should be placed where the "Preferences..." menu item is in the application menu. |
| QAction::QuitRole | 6 | This action should be placed where the Quit menu item is in the application menu. |
2,enum QAction::Priority
| Constant | Value | Description |
|---|---|---|
| QAction::LowPriority | 0 | 低優先級 |
| QAction::NormalPriority | 128 | 中 |
| QAction::HighPriority | 256 | 高 |
————————————————————————————————————————————————————————————————————
公有函數如下:
QWidgetAction(QObject * parent) virtual ~QWidgetAction() QWidget * defaultWidget() const void releaseWidget(QWidget * widget) QWidget * requestWidget(QWidget * parent) void setDefaultWidget(QWidget * widget)//主要用這個設置自定義部件
————————————————————————————————————————————————————————————————————
QActionGroup(QObject * parent) ~QActionGroup() QList<QAction *> actions() const QAction * addAction(QAction * action)//返回的是原action QAction * addAction(const QString & text) QAction * addAction(const QIcon & icon, const QString & text) QAction * checkedAction() const//返回當前被選中的action bool isEnabled() const bool isExclusive() const bool isVisible() const void removeAction(QAction * action)
Public Slots
| void | setDisabled(bool b) |
| void | setEnabled(bool) |
| void | setExclusive(bool)//設置互斥性,默認互斥 |
| void | setVisible(bool) |
Signals
| void | hovered(QAction * action) |
| void | triggered(QAction * action) |
————————————————————————————————————————————————————————————————————
測試示例,主菜單文件中測試了QActionGroup各函數效果,工具欄測試QAction各函數,系統托盤中測試QWidgetAction,加了個列表進去。
效果如圖:



代碼如下:
#include "mainwindow.h" #include "ui_mainwindow.h" #include <QListWidget> #include <QWidgetAction> #include <QAction> #include <QMenu> #include <QIcon> #include <QKeySequence> MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent), ui(new Ui::MainWindow) { ui->setupUi(this); menu=new QMenu("菜單"); menu->addAction("子菜單"); //QAction ac1=new QAction(this); ac1->setText("setText"); //ac1->setSeparator(true); ac1->setStatusTip("setStatusTip"); ac1->setToolTip("setToolTip"); ac1->setWhatsThis("setWhatsThis"); ac1->setIcon(QIcon("://tray.ico")); ac1->setIconText("setIconText"); ac1->setMenu(menu); ac1->setCheckable(true); ac1->setData(QString("setData")); ac1->setPriority(QAction::HighPriority); ac1->setShortcut(QKeySequence(tr("Ctrl+P"))); ui->mainToolBar->addAction(ac1); //QActionGroup main_ac1=new QAction("左對齊",this);//創建動作 main_ac2=new QAction("右對齊",this); main_ac3=new QAction("居中對齊",this); main_ac1->setCheckable(true);//設置是否可選中 main_ac2->setCheckable(true); main_ac3->setCheckable(true); QActionGroup *alignmentGroup = new QActionGroup(this); alignmentGroup->addAction(main_ac1);//將動作加入組 alignmentGroup->addAction(main_ac2); alignmentGroup->addAction(main_ac3); main_ac2->setChecked(true);//設置一個默認選中的 QActionGroup *Group = new QActionGroup(this); QAction *ac_1 = Group->addAction("粗體"); QAction *ac_2 = Group->addAction("傾斜"); ac_1->setCheckable(true); ac_2->setCheckable(true); Group->setExclusive(false); //connect(ac,SIGNAL(triger)…… QMenu *menu2=new QMenu("設置",this); menu2->addAction(main_ac1);//將動作加入菜單 menu2->addAction(main_ac2); menu2->addAction(main_ac3); menu2->addAction(ac_1); menu2->addAction(ac_2); ui->menuBar->addMenu(menu2); //QWidgetAction //構建個自定義小部件 QListWidget *lw=new QListWidget; lw->addItem("列表項1"); lw->addItem("列表項2"); lw->addItem("列表項3"); //將部件加入QWidgetAction QWidgetAction *a1=new QWidgetAction(this); a1->setDefaultWidget(lw); //將QWidgetAction加入到QMenu QMenu *menu3=new QMenu(this); menu3->addAction(a1); //建立托盤圖標,將QMenu加入到托盤圖標右鍵菜單中 QIcon icon("://tray.ico"); trayIcon = new QSystemTrayIcon(this); trayIcon->setIcon(icon); trayIcon->setContextMenu(menu3); trayIcon->setVisible(true); } MainWindow::~MainWindow() { delete ui; }
