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;
}  
时间: 2024-08-05 02:27:09

Qt Widgets——菜单和菜单栏的相关文章

Qt Widgets——主窗口及其主要组成部分

Main Window and Related Classes QAction 动作类,用于当做一个菜单项或工具项插入菜单或工具栏 QActionGroup 动作组,用于管理多个动作,设置它们之间的互斥性等 QWidgetAction 部件动作,继承自QAction,用于将小部件插入菜单或工具栏 QDockWidget 悬浮部件,程序运行后可鼠标拖动的部件 QMainWindow 主窗口,是其它部件的容器 QMdiArea 子区域,加到QMainWindow中,用于放置多个QMdiSubWind

qt之菜单项定制

qt实现菜单,简单的界面QMenu+QAction完全可以实现,在加上qss的支持,可以定制出比较美观的菜单,qt的菜单一般用在托盘.按钮和工具栏上. 当然啦,也有很多软件有比较美观的托盘菜单,比如360.电脑管家等软件,效果图如图1所示,其实qt在4.2之后也提供了定制菜单的功能,使用QWidgetAction可以定制出自己想要的菜单来,接下来是我定制菜单栏的步骤. 图1 360图盘菜单 实现效果如下图2所示,菜单是由单个条目组成的,每一个条目又由左右两部分组成,左边是一个图标,并伴有底色,右

Qt Widgets Application可执行程序发布方式

前言 写好的Qt程序想打包发布,之前按照Qt快速入门系列教程里的方法,直接选release,构建,之后找到exe,拷贝几个dll,然而报错如图: 后来找到教程:http://tieba.baidu.com/p/3730103947 ,方便有效地解决了问题,特此记录. Qt Widgets Application可执行程序发布方式 1.选择release,点击绿色小三角开始构建 2.找到相应文件夹 3.找到exe,把它复制到想要发布的一个文件夹里 4.开始菜单中搜索Qt,选择如图的命令行选项 打开

QT5中的pro文件中为何要加入&quot;QT += widgets&quot;

在pro文件里写"QT+=widgets"表示引入QtWidget这个module,qmake在生成makefile的时候,会设置好include path 和 lib path,在link时候设置好libs. QT += widgets包括两部分: 1:Lib,这个是lib的路径和lib文件的文件名. 2:include  , *.h的路径在pro文件里设置,.h的文件名用代码里的#include设定 QT += widgets 貌似可以分开写成(大致是这样): INCLUDE+=

公布Qt Widgets桌面应用程序的方法

公布Qt Widgets桌面应用程序的方法 Qt是一款优秀的跨平台开发框架,它能够在桌面.移动平台以及嵌入式平台上执行.眼下Qt 5介绍程序公布的文章帖子比較少.大家又很想要知道怎样公布Qt应用程序,于是我花了一点儿时间介绍一下怎样公布Qt桌面应用程序. 上海萌梦信息科技有限公司(微博:http://weibo.com/qtdream)原创文章,首发地址:http://qtdream.com/topic/113.欢迎同行前来探讨. 首先我们从最简单的项目Qt Widgets開始说起.Qt Wid

发布Qt Widgets桌面应用程序的方法

发布Qt Widgets桌面应用程序的方法 Qt是一款优秀的跨平台开发框架,它可以在桌面.移动平台以及嵌入式平台上运行.目前Qt 5介绍程序发布的文章帖子比较少.大家又非常想要知道如何发布Qt应用程序,于是我花了一点儿时间介绍一下如何发布Qt桌面应用程序. 上海萌梦信息科技有限公司(微博:http://weibo.com/qtdream)原创文章,首发地址:http://qtdream.com/topic/113.欢迎同行前来探讨. 首先我们从最简单的项目Qt Widgets开始说起.Qt Wi

Qt 3D教程(一)使用Qt Widgets建立一个框架

Qt3D教程(一)使用Qt Widgets建立一个框架 Qt 3D是Qt 5.5发布时最重要的一个新模块,它很好地将3D的繁文缛节封装在底层,留给我们的是简洁的对象创建方法,它也不需要你掌握太多的着色器知识,只需要懂得一些三维和光照的基本知识就可以创建出比较美观的三维模型浏览程序了.目前虽然大家都能够使用Qt 5.5和Qt 3D了,但是我查看了一下,有关API文档和一个详尽的介绍还是空缺的,因此我认为有必要写一点教程,简要介绍一下Qt 3D的使用方法. 蒋彩阳原创文章,首发地址:http://b

Qt on Android:让 Qt Widgets 和 Qt Quick 应用全屏显示

Android 系统版本很多,较新的 4.4 ,较老的 2.3 ,都有人用. Qt on Android 开发的 Android 应用,默认在 Android 设备上是非全屏的.而有些应用的需求是全屏显示,比如游戏.那么怎么样才能做到这点呢? 请给我的决赛文章<Qt Quick 图像处理实例之美图秀秀(附源码下载)>投票,谢谢. 我们需要分 Android 系统版本来说. Android 2.x 对于 4.0 以前,比如 2.2 . 2.3 的系统,可以修改 AndroidManifest.x

笔记:QT的菜单

1.创建菜单栏和菜单 1 QMenuBar *menuBar = new QMenuBar(this); 2 QMenu *file = menuBar->addMenu("&file");//用&来指定快捷键 3 file->addAction("新建"); 2.创建可选择的菜单 1 QAction *newFile = file->addAction("打开(&O)"); 2 newFile->