主窗口MainWindow需要菜單欄QMenuBar及菜單QMenu來組成自身,一般應用程序的所有功能都能在菜單中找到。接下來就來說說它們。
它添加了很多動作QAction,並用自身組成了菜單欄QMenuBar上的菜單,當然也可用於基它地方,如上下文菜單等。
公有函數如下:
QMenu(QWidget * parent = 0) QMenu(const QString & title, QWidget * parent = 0) ~QMenu() QAction * addAction(const QString & text)//添加動作 QAction * addAction(const QIcon & icon, const QString & text) QAction * addAction(const QString & text, const QObject * receiver, const char * member, const QKeySequence & shortcut = 0)//嘗試失敗,求教const char * member該如何? QAction * addAction(const QIcon & icon, const QString & text, const QObject * receiver, const char * member, const QKeySequence & shortcut = 0) void addAction(QAction * action) QAction * addMenu(QMenu * menu)//添加菜單 QMenu * addMenu(const QString & title) QMenu * addMenu(const QIcon & icon, const QString & title) QAction * insertMenu(QAction * before, QMenu * menu) QAction * addSection(const QString & text)// QAction * addSection(const QIcon & icon, const QString & text) QAction * addSeparator()//添加分隔線 QAction * insertSection(QAction * before, const QString & text) QAction * insertSection(QAction * before, const QIcon & icon, const QString & text) QAction * insertSeparator(QAction * before) void popup(const QPoint & p, QAction * atAction = 0)//該菜單在p坐標點彈出 QAction * exec()//該菜單在0,0 坐標出現,執行后阻塞程序,返回點擊的動作或0(什么也沒點,如按Esc鍵) QAction * exec(const QPoint & p, QAction * action = 0)//上同,位置一般為:1,鼠標位置exec(QCursor::pos());2,與某部件對齊exec(somewidget.mapToGlobal (QPoint(0, 0)));3,通過QMouseEvent *e,exec(e->globalPos()); void hideTearOffMenu() void clear()//清除菜單中的所有項 void setActiveAction(QAction * act) void setAsDockMenu() void setDefaultAction(QAction * act) void setIcon(const QIcon & icon) void setSeparatorsCollapsible(bool collapse) void setTearOffEnabled(bool) void setTitle(const QString & title) void setToolTipsVisible(bool visible) QIcon icon() const QAction * defaultAction() const QString title() const NSMenu * toNSMenu() bool toolTipsVisible() const QAction * actionAt(const QPoint & pt) const QRect actionGeometry(QAction * act) const QAction * activeAction() const bool isEmpty() const bool isTearOffEnabled() const bool isTearOffMenuVisible() const QAction * menuAction() const bool separatorsCollapsible() const
Signals
void | aboutToHide() |
void | aboutToShow() |
void | hovered(QAction * action) |
void | triggered(QAction * action) |
靜態成員函數Static Public Members,可用它將一些actions組合成一個菜單
QAction * | exec(QList<QAction *> actions, const QPoint & pos, QAction * at = 0, QWidget * parent = 0) |
————————————————————————————————————————————————————————————————
它是主窗口存放菜單的地方。
在windows上可認為它就是那個大理石顏色的一欄
函數如下:
QMenuBar(QWidget * parent = 0) ~QMenuBar() QAction * addMenu(QMenu * menu)//以下幾個添加菜單的比較常用 QMenu * addMenu(const QString & title) QMenu * addMenu(const QIcon & icon, const QString & title) void setActiveAction(QAction * act) void setCornerWidget(QWidget * widget, Qt::Corner corner = Qt::TopRightCorner)//在菜單條的最左或最右添加個小部件,corner可以為Qt::TopRightCorner(最右)或 Qt::TopLeftCorner(最左) void setDefaultAction(QAction * act)//只支持Windows Mobile,手機上的“左軟鍵” void setDefaultUp(bool)//默認false,菜單正常地下拉顯示,如設成false,則菜單往上拉顯示 void setNativeMenuBar(bool nativeMenuBar)//菜單本地化,只支持Mac OS X和Windows CE。我想,如ubuntu上,當窗口最大化時,菜單附着於最上一欄一樣吧……(On t<span style="white-space:pre"> </span>hese platforms if this property is true, the menubar is used in the native menubar and is not in the window of its parent, if false the me<span style="white-space:pre"> </span>nubar remains in the window.On other platforms the value of this attribute has no effect.) void clear()//清除所有action QWidget * cornerWidget(Qt::Corner corner = Qt::TopRightCorner) const QAction * defaultAction() const bool isDefaultUp() const bool isNativeMenuBar() const NSMenu * toNSMenu() QAction * actionAt(const QPoint & pt) const QRect actionGeometry(QAction * act) const QAction * activeAction() const QAction * addAction(const QString & text)//以下四個添加動作或菜單,該動作將直接顯示在菜單條上,感覺四個函數都比較讓人無語,想不出官方添加它們的用意! QAction * addAction(const QString & text, const QObject * receiver, const char * member) void addAction(QAction * action) QAction * insertMenu(QAction * before, QMenu * menu) QAction * addSeparator()//在菜單條上添加分隔線,試了下,沒看到效果,和以上四個一樣讓人無語 QAction * insertSeparator(QAction * before)
Public Slots
virtual void | setVisible(bool visible) |
Signals
void | hovered(QAction * action) |
void | triggered(QAction * action)//點擊觸發的動作,可用它判斷是哪個動作觸發,代替信號槽的使用 |
—————————————————————————————————————————————————————————————————
簡單測試示例如下:
#include "mainwindow.h" #include "ui_mainwindow.h" #include <QDebug> #include <QAction> #include <QPushButton> #include <QCursor> #include <QKeySequence> MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent), ui(new Ui::MainWindow) { ui->setupUi(this); QMenu *menu1= new QMenu("hello"); menu1->addAction("菜單項1"); menu1->addAction("菜單項2"); if(QAction *act=menu1->exec(QCursor::pos())) { qDebug()<< act->text() <<"triggered"; } file_menu=new QMenu("文件"); file_menu->addAction("打開");//可用返回的QAction 連接槽函數 //file_menu->addAction("退出",this,exit,QKeySequence("Ctrl+E"));//失敗 file_menu->addSeparator(); file_menu->addSection("Section");//貌似無效果 file_menu->addMenu(menu1); ui->menuBar->addMenu(file_menu); QPushButton *btn=new QPushButton("hello"); ui->menuBar->setCornerWidget(btn,Qt::TopLeftCorner); ui->menuBar->setDefaultUp(true); } MainWindow::~MainWindow() { delete ui; }