【Qt】QMainWidget中的栏和菜单

默认结构最复杂的标准窗口

  • 提供了菜单栏, 工具栏, 状态栏, 停靠窗口
  • 菜单栏: 只能有一个, 创建的最上方
  • 工具栏: 可以有多个, 默认提供了一个, 窗口的上下左右都可以停靠
  • 状态栏: 只能有一个, 窗口最下方
  • 停靠窗口: 可以有多个, 默认没有提供, 窗口的上下左右都可以停靠

在这里插入图片描述

菜单栏

在Qt中菜单栏类是QMenuBar,菜单栏是一个长条状窗口,可以是横向也可以是纵向的,菜单栏上可以布置菜单。

创建menubar

//方法一,获取QMainWindow提供的menubar
auto menu = menuBar();
//方法二,new一个menubar给窗口
QMenuBar* menubar = new QMenuBar;
this->setMenuBar(menubar);

添加menu

创建完菜单栏之后,就可以在菜单栏上面布置菜单,菜单类是QMenu。

auto filemenu=menu->addMenu("文件");
auto editmenu=menu->addMenu("编辑");
auto viewmenu = menu->addMenu("视图");

在这里插入图片描述

添加action和设置快捷键

以VS的界面为例,点击菜单下面会显示一堆菜单项,要实现这个就要给指定的菜单添加动作。Qt里面对应的类是QAction
在这里插入图片描述

auto filemenu=menu->addMenu("文件(&F)");//设置了快捷键alt+f
filemenu->addAction("关闭");
filemenu->addAction(QIcon(":/Resource/file_icon.png"),"新建");//给菜单项设置了图标
filemenu->addAction("保存", this,[]() {qDebug() << "保存"; });//添加动作的同时设置好槽
filemenu->addAction("打开", []()
	{
		qDebug() << "打开";
	}, QKeySequence("Ctrl+Shift+J"));

在这里插入图片描述

单击菜单项, 该对象会发出一个信号

// 点击QAction对象发出该信号
[signal] void QAction::triggered(bool checked = false);
auto action = viewMenu->addAction("显示行号");
action->setCheckable(true);
connect(action, &QAction::triggered, this, [](bool checked) {
			qDebug() << checked;
		});

在这里插入图片描述

工具栏

创建工具栏

QToolBar *toolbar =  addToolBar("toolbar");

添加action

//没有图标就显示文字 (如下图)
toolbar->addAction("工具");
//有图标就显示图标,文字作为提示(鼠标移上去会显示)
toolbar->addAction(style()->standardIcon(QStyle::StandardPixmap::SP_TitleBarMenuButton),"Qt");

在这里插入图片描述

添加Widget

可以给工具栏添加QWidget或者其子类,添加的最多的是QToolButton

auto toolbar2 = addToolBar("toolbar2");
QToolButton* btn = new QToolButton;
btn->setText("Debug");
btn->setIcon(style()->standardPixmap(QStyle::SP_ArrowLeft));
toolbar2->addWidget(btn);
//添加上toolbutton后要给按钮设置一下文本或图标,不然看不到
btn->setText("编译");
btn->setIcon(style()->standardPixmap(QStyle::SP_ArrowLeft));
//btn->setToolButtonStyle(Qt::ToolButtonStyle::ToolButtonTextBesideIcon);

在这里插入图片描述

VS的这个工具栏按钮点击后会弹出一个菜单,接下来用Qt实现这个效果。
在这里插入图片描述

//创建一个菜单
QMenu* menu = new QMenu;
menu->addAction("1.cpp");
menu->addAction("2.cpp");
menu->addAction("3.cpp");
menu->addAction("4.cpp");
//把菜单添加到toolButton
btn->setMenu(menu);
//设置菜单的弹出风格
btn->setPopupMode(QToolButton::ToolButtonPopupMode::MenuButtonPopup);

在这里插入图片描述

状态栏

一般情况下, 需要在状态栏中添加某些控件, 显示某些属性, 使用最多的就是添加标签 QLabel

创建状态栏

//获取自带的
QStatusBar* sbar = statusBar();
//new一个
QStatusBar* sbar = new QStatusBar;
this->setStatusBar(statusbar);

添加Widget

//左边
sbar->addWidget(new QPushButton(style()->standardIcon(QStyle::StandardPixmap::SP_DesktopIcon), "desktop"));
sbar->addWidget(new QLabel("消息"));
//这里单独搞一个变量btn出来是因为后面要用
auto btn = new QPushButton("hello world");
//右边(Permanent永久的)
sbar->addPermanentWidget(btn);

在这里插入图片描述

接下来测试一下messageChanged这个信号和showMessage这个槽
在这里插入图片描述

connect(btn, &QPushButton::clicked, this, [=]{
	bar->showMessage("正在加载中...");
	QTimer::singleShot(2000, [=]{
		sbar->showMessage("就绪");
		QTimer::singleShot(2000, [=]{
			sbar->clearMessage();
		});
	});
});
connect(sbar, &QStatusBar::messageChanged, this, [](const QString&msg) {
			qDebug() << msg;
});	

在这里插入图片描述

浮动窗口

//添加中心窗口
setCentralWidget(new QTextEdit);

QDockWidget* gitDock = new QDockWidget("Git");
QDockWidget* solveDock = new QDockWidget("解决方案管理器");
QDockWidget* teamDock = new QDockWidget("团队资源管理器");
QDockWidget* resourceDock = new QDockWidget("资源视图");

addDockWidget(Qt::DockWidgetArea::TopDockWidgetArea, gitDock);
ddDockWidget(Qt::DockWidgetArea::BottomDockWidgetArea, solveDock);
addDockWidget(Qt::DockWidgetArea::LeftDockWidgetArea, teamDock);
addDockWidget(Qt::DockWidgetArea::RightDockWidgetArea, resourceDock);

在这里插入图片描述

分割浮动窗口

  • 将第一个浮动窗口所覆盖的空间分成两部分,将第一个浮动窗口移动到第一部分,并将第二个浮动窗口移动到第二部分。
splitDockWidget(teamDock, resourceDock, Qt::Vertical);

在这里插入图片描述

选项卡式停靠

  • 将第二个浮动窗口移动到第一个浮动窗口之上,在主窗口中创建一个选项卡式停靠区域。
tabifyDockWidget(gitDock, solveDock);

在这里插入图片描述

菜单

右键菜单

在桌面右击鼠标会出现菜单,那么在Qt中如何使用右键菜单?

  • 通过事件处理

    重写右键菜单弹出请求事件处理函数

void menu1() {
	m_contextMenu = new QMenu;
	QAction* copyAct =m_contextMenu->addAction("复");
	QAction* pasteAct =m_contextMenu->addAction("粘");
}
void contextMenuEven(QContextMenuEvent* event)override
{
	qDebug() << "右键菜单请求弹出";
	m_contextMenu->popu(event->globalPos());
}

在这里插入图片描述

  • 通过信号与槽处理

首先需要给控件设置上下文菜单策略setContextMenuPolic(Qt::CustomContextMenu) ;设置该策后当我们右键点击控件时qt会发送一个信号customContextMenuRequested(constQPoint &pos) ,其中参数pos用来传递右点击时的鼠标的坐标,这个坐标一般是相于控件左上角而言的

void menu2() {
  setContextMenuPolic(Qt::ContextMenuPolicy::CustomontextMenu);
  m_contextMenu = new QMenu;
  QAction* copyAct =m_contextMenu->addAction("复");
  QAction* pasteAct =m_contextMenu->addAction("粘");
  connect(this, QWidget::customContextMenuRequsted, this, [=](const QPoint&pos) {
  	auto p = this->mapToGloba(pos);
  	m_contextMenu->popup(p);
  	});
}

托盘菜单

  • 设置菜单
QMenu* menu = new QMenu;
QAction*openMainWindow = menu->addAction("打开主窗口");
menu->addSeparator();
QAction*quit = menu->addAction("退出程序");

trayIcon->setContextMenu(menu);
  • 处理菜单消息
connect(openMainWindow,&QAction::triggered,this,&QWidget::showNormal);
connect(quit,&QAction::triggered,this,&QApplication::quit);
  • 根据托盘菜单激活原因进行处理
connect(trayIcon,&QSystemTrayIcon::activated,this,&Widget::onActivated);

void Widget::onActivated(QSystemTrayIcon::ActivationReason)
{
    switch (reason)
    {
    case QSystemTrayIcon::Unknown:      //未知原因
        qDebug()<<"Unknown";
        break;
    case QSystemTrayIcon::Context:      //右键请求菜单
        qDebug()<<"Context";
        break;
    case QSystemTrayIcon::DoubleClick:  //系统托盘被双击
        this->showNormal();    
        qDebug()<<"DoubleClick";
        break;
    case QSystemTrayIcon::Trigger:      //系统托盘被点击
        bubbleMessage();
        qDebug()<<"Trigger";
        break;
    case QSystemTrayIcon::MiddleClick:  //系统托盘被鼠标中键点击
        qDebug()<<"MiddleClick";
        break;
    }
}

  • 0
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值