Qt模块化笔记之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		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		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;
}


  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 下面是一个使用 Qt 和 C++ 编写带菜单栏界面的示例代码: ``` #include <QApplication> #include <QMainWindow> #include <QMenuBar> #include <QMenu> #include <QAction> int main(int argc, char *argv[]) { QApplication a(argc, argv); QMainWindow window; QMenuBar *menuBar = window.menuBar(); QMenu *fileMenu = menuBar->addMenu("文件"); QAction *openAction = fileMenu->addAction("打开"); window.show(); return a.exec(); } ``` 该代码创建了一个带菜单栏的主窗口,并在菜单栏中添加了一个名为“文件”的菜单,该菜单中包含一个名为“打开”的操作。 ### 回答2: 要编写带菜单栏的界面代码,我们可以使用Qt和C++进行开发。 首先,我们需要创建一个Qt应用程序项目,并打开Qt的集成开发环境。在Qt的主界面中,选择"新建项目",然后选择"Qt Widgets应用程序",输入项目的名称,并选择所需的配置和路径。 在项目中,我们需要创建一个新的主窗口类。首先,我们需要包含所需的头文件,如QMainWindow和QMenuBar。然后,我们需要创建一个继承自QMainWindow的新的类,我们可以将其命名为MainWindow。在MainWindow类的构造函数中,我们需要设置窗口的标题和大小,并创建一个菜单栏。 为了创建菜单栏,我们需要创建一个QMenuBar对象,并将其设置为MainWindow的菜单栏。然后,我们可以使用addMenu方法来添加菜单。每个菜单可以使用QMenu类来创建。在每个菜单中,我们可以使用addAction方法来添加动作。每个动作都可以使用QAction类来创建。 在每个动作中,我们可以设置动作的名称和快捷键,还可以连接到一个槽函数。槽函数可以是MainWindow类中的一个公共槽函数,也可以是其他类中的槽函数。 在MainWindow类中,我们可以添加其他所需的功能,如按钮、文本框等。我们可以使用Qt提供的各种控件类来创建这些功能。 最后,我们需要在main函数中创建一个MainWindow对象,并显示窗口。我们可以使用show方法来显示窗口,并使用exec方法进入Qt的主事件循环。 总结来说,使用Qt和C++编写带菜单栏的界面代码,我们需要创建一个继承自QMainWindow的主窗口类,并使用QMenuBar、QMenu和QAction来创建菜单栏菜单项。然后,我们可以在菜单项上设置动作和槽函数。最后,我们需要在main函数中创建窗口对象,并显示窗口。以上是简要的代码框架,具体的实现可能需要更多的代码和细节。 ### 回答3: Qt是一款跨平台的框架,可以用来开发图形化界面。而C++是一种编程语言,也可以用来编写图形界面的代码。 要编写带菜单栏的界面代码,首先需要创建一个窗口。可以使用Qt的QMainWindow类来创建主窗口。然后,可以使用QMenuBar类来添加一个菜单栏。以下是一个示例代码: ```cpp #include <QtWidgets> int main(int argc, char *argv[]) { QApplication app(argc, argv); QMainWindow window; window.setWindowTitle("带菜单栏的界面"); QMenuBar* menuBar = window.menuBar(); QMenu* fileMenu = menuBar->addMenu("文件"); QAction* openAction = fileMenu->addAction("打开"); QAction* saveAction = fileMenu->addAction("保存"); QAction* exitAction = fileMenu->addAction("退出"); QObject::connect(exitAction, &QAction::triggered, &app, &QApplication::quit); window.show(); return app.exec(); } ``` 以上代码首先创建了一个QMainWindow类的实例,然后调用setWindowTitle方法设置了窗口的标题。 接下来,在窗口的菜单栏上添加了一个名为"文件"的菜单,然后在该菜单上添加了"打开"、"保存"和"退出"三个动作。 最后使用连接(connect)的方式,将退出动作的触发(triggered)信号连接到QApplication实例的quit()方法上,这样当用户点击退出动作时,应用程序会退出。 最后,通过调用show方法显示窗口,并通过调用app.exec()方法来启动应用程序的事件循环。 以上就是一个简单的Qt和C++编写带菜单栏的界面代码的示例。在实际的应用中,还可以添加更多的菜单和动作,并根据需要进行逻辑处理。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值