当前位置:首页 >> 智能终端演进 >> 【Qt】QMainWidget中的栏和菜单,z60t(qt widget添加菜单栏)

【Qt】QMainWidget中的栏和菜单,z60t(qt widget添加菜单栏)

cpugpu芯片开发光刻机 智能终端演进 2
文件名:【Qt】QMainWidget中的栏和菜单,z60t 【Qt】QMainWidget中的栏和菜单

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

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

菜单栏

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

创建menubar //方法一,获取QMainWindow提供的menubarauto 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+ffilemenu->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");//把菜单添加到toolButtonbtn->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;}}
协助本站SEO优化一下,谢谢!
关键词不能为空
同类推荐
«    2025年12月    »
1234567
891011121314
15161718192021
22232425262728
293031
控制面板
您好,欢迎到访网站!
  查看权限
网站分类
搜索
最新留言
文章归档
网站收藏
友情链接