Qt Widgets——菜單和菜單欄


主窗口MainWindow需要菜單欄QMenuBar及菜單QMenu來組成自身,一般應用程序的所有功能都能在菜單中找到。接下來就來說說它們。

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)

————————————————————————————————————————————————————————————————

QMenuBar

它是主窗口存放菜單的地方。

在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;  
}  


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM