Qt QMenuBar、QMenu、QAction、QStatusBar、QMainWindow简单介绍

Qt的GUI程序有一个常用的顶层窗口,叫做MainWindow。MainWindow继承自QMainWindow。QMainWindow窗口分成几个主要的区域:
在这里插入图片描述

最上面是Window Title,用于显示标题和控制按钮,比如最大化、最小化和关闭等;下面一些是Menu Bar,用于显示菜单;再下面一点事Toolbar areas,用于显示工具条,注意,Qt的主窗口支持多个工具条显示,因此这里是ares,你可以把几个工具条并排显示在这里,就像Word2003一样;工具条下面是Dock window areas,这是停靠窗口的显示区域,所谓停靠窗口就是像Photoshop的工具箱一样,可以在主窗口的四周显示;再向下是Status Bar,就是状态栏;中间最大的Central widget就是主要的工作区了。

mainwindow的ui文件是默认有menubar,maintoolbar和statusbar的。

  • QMenuBar:窗口的菜单栏,在此基础上添加不同的QMenu和QAction
  • QMenu:菜单,可以显示文本和图标,但是并不负责执行操作
  • QAction: 负责执行操作的部件
  • QStatusBar:负责提示的状态栏,通常在窗口最下侧

一、通过设计器添加菜单栏和状态栏

参考大神博客:Qt添加菜单栏和工具栏

二、自定义菜单栏

//插入菜单栏
	QMenuBar* menuBar = new QMenuBar(this);
	menuBar->resize(width(), menuBar->height());
	//一级菜单
	QMenu* menu1 = menuBar->addMenu(QStringLiteral("菜单1"));
	//绑定信号槽
	//包含QMenu所有的子菜单都会触发
	connect(menu1, &QMenu::triggered, [=](const QAction *action) {
		qDebug() << QStringLiteral("一级菜单被按下:") << action->text() << endl;
	});
	//二级菜单
	QAction* action1 = menu1->addAction(QStringLiteral("二级菜单1.1"));
	//绑定信号槽
	connect(action1, &QAction::triggered, [=]() {
		qDebug() << QStringLiteral("二级菜单1.1被按下") << endl;
	});

	QAction* action2 = menu1->addAction(QStringLiteral("二级菜单1.2"));
	//绑定信号槽
	connect(action1, &QAction::hovered, [=]() {
		qDebug() << QStringLiteral("二级菜单1.2鼠标移上去") << endl;
	});
	QAction* action3 = menu1->addAction(QStringLiteral("二级菜单1.3"));
	//设置图标
	action3->setIcon(QIcon("1.jpg"));
	//三级菜单
	QMenu* m = menu1->addMenu(QStringLiteral("二级菜单1.4"));
	m->setIcon(QIcon("1.jpg"));
	QAction* action4 = m->addAction(QStringLiteral("三级菜单1.4.1"));

	QMenu* menu2 = menuBar->addMenu(QStringLiteral("菜单2"));
	QMenu* menu3 = menuBar->addMenu(QStringLiteral("菜单3"));

三、鼠标悬停产生动态QMenu

//插入菜单栏
	QMenuBar* menuBar = new QMenuBar(this);
	menuBar->resize(width(), menuBar->height());
	//一级菜单
	QMenu* menu1 = menuBar->addMenu(QStringLiteral("菜单1"));
	//鼠标悬停动态产生QMenu菜单
	connect(menuBar, &QMenuBar::hovered, [=](const QAction *action) {
		if (action->text() == QStringLiteral("菜单3"))
		{
			//动态菜单
			action->menu()->clear();
			action->menu()->addAction(QStringLiteral("菜单3.1"));
			action->menu()->addAction(QStringLiteral("菜单3.2"));
			action->menu()->addAction(QStringLiteral("菜单3.3"));
		}
	});

	QMenu* menu2 = menuBar->addMenu(QStringLiteral("菜单2"));
	QMenu* menu3 = menuBar->addMenu(QStringLiteral("菜单3"));

四、QMenu菜单的单选和多选

  • void setCheckable(bool); 设置多选
  • void setChecked(bool); 设置是否选中
  • void setExclusive(bool); 设置单选
//二级菜单
	QAction* action1 = menu1->addAction(QStringLiteral("二级菜单1.1"));
	QAction* action2 = menu1->addAction(QStringLiteral("二级菜单1.2"));
	QAction* action3 = menu1->addAction(QStringLiteral("二级菜单1.3"));
	//设置多选
	action1->setCheckable(true);
	action2->setCheckable(true);
	action3->setCheckable(true);
	//设置选中
	action3->setChecked(true);	

	QActionGroup *group = new QActionGroup(this);
	group->addAction(action1);
	group->addAction(action2);
	group->addAction(action3);
	//设置多选
	group->setExclusive(true);

五、QMenu按钮菜单(右键菜单)

//插入菜单栏
	QMenuBar* menuBar = new QMenuBar(this);
	menuBar->resize(width(), menuBar->height());
	//一级菜单
	menu1 = menuBar->addMenu(QStringLiteral("菜单1"));
	connect(ui.pushButton, &QPushButton::clicked, [=]() {
		menu1->exec(QCursor::pos());	//鼠标点击位置处添加菜单
	});

1. 可以直接通过设计器里面(动作)添加QAction,然后再代码里面将此Action()添加到菜单项,同时可以设置快捷方式

六、QToolBar工具栏和QStatusBar状态栏

1. QToolBar工具栏

	//工具栏,菜单项的快捷方式
    QToolBar *toolBar = addToolBar("toolBar");
    //设置图标尺寸
    toolBar->setIconSize(QSize(30, 30));
    //工具栏添加快捷键
    toolBar->addAction(pNew);
    QPushButton *b = new QPushButton(this);
    b->setText("^_^");
    //添加小控件
    toolBar->addWidget(b);

2. QStatusBar状态栏

 //状态栏
    QStatusBar *sBar = statusBar();
    QLabel *label = new QLabel(this);
    label->setText("Normal text file");
    sBar->addWidget(label);
    //addWidget 从左往右添加
    sBar->addWidget(new QLabel("2", this));

    // addPermanentWidget 从右往左添加
    sBar->addPermanentWidget(new QLabel("3", this));
    //实现消息定时消失
    sBar->showMessage(QStringLiteral("测试消息三秒消失"),3000);

七、QMainWindow菜单工具状态栏

  • QMenuBar *menuBar() const; 可以直接获取菜单栏
  • QStatusBar *statusBar() const; 可以直接获取状态栏
	this->menuBar()->addAction(QStringLiteral("测试"));
	this->statusBar()->showMessage(QStringLiteral("这是一个状态栏"), 5000);

	ui.mainToolBar->addAction(QStringLiteral("按钮一"));
	ui.mainToolBar->addAction(QIcon("1.jpg"), QStringLiteral("按钮二"));
	//文本显示在图标下面
	ui.mainToolBar->setToolButtonStyle(Qt::ToolButtonTextUnderIcon);

	//工具栏换行
	this->addToolBarBreak();	
	//默认顶部插入
	QToolBar *b = this->addToolBar("Tool2");
	b->addAction(QStringLiteral("按钮2"));

	//左侧插入
	QToolBar *t = new QToolBar(QStringLiteral("按钮2"));
	t->addAction(QStringLiteral("左侧"));
	this->addToolBar(Qt::LeftToolBarArea, t);	//Qt::LeftToolBarArea左侧,  可以在顶部,底部,右侧
  • 0
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值