【QT】-- QMainWindow简介


前言

  • Qt是C++一个开发框架,具有跨平台特性。
  • 这篇是作者大二学习的时候做的笔记,有可能有错误,请各位批评指正。
  • 这篇记录Qt的QMainWindow,相当于给界面添加细节工具
  • 欢迎大家收藏 + 关注,作者将会持续更新。

文章目录

1. QMainWindow

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

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

1.1 菜单栏

创建MenuBar

  • 获取QMainWindow提供的菜单栏
cpp 复制代码
QMenuBar* menubar = menuBar();   //MenuBar 是qml里面的
  • 自己new一个,然后设置给窗口
cpp 复制代码
QMenuBar* menubar = new QMenuBar;
this->setMenuBar(menubar);

添加Menu

cpp 复制代码
QMenu* m = new QMenu("文件");  //或者直接调用菜单栏里面的函数
m->addAction("new");
m->addAction("open");
//添加已有菜单,返回菜单关联的动作
QAction* act = menubar->addMenu(m);
//通过标题添加菜单
QMenu *editMenu = menubar->addMenu("编辑");
//通过图标和标题添加菜单
QMenu *buildMenu = menubar->addMenu(QIcon(":/images/mm.png"),"构建");

添加Action

cpp 复制代码
editMenu->addAction("undo");
editMenu->addAction(style()->standardIcon
                    (QStyle::StandardPixmap::SP_FileIcon),"redo");
editMenu->addAction("remove",this,[](){qDebug()<<"remove";});
editMenu->addAction("剪切",[](){qDebug()<<"剪切";},QKeySequence("ctrl+x"));

添加图标/设置选中

在菜单栏中菜单添加菜单添加图标,会覆盖掉文字,但是在菜单项中菜单中菜单项或者菜单加图标可以和文字一起显示

cpp 复制代码
QMenuBar* menubar = menuBar();
QMenu* menu = menubar->addMenu(QIcon(":/Resource/women.png"), "文本");

/* QMenu* menu = new QMenu("文件");//注意:在菜单栏里面添加菜单这样就没有添加图标的重载
menu->addAction("新建文件夹");
menu->addAction("新建窗口");
menu->addAction("打开");
menu->addAction("保存");*/
        
//设置菜单里面的菜单
QMenu* eat = new QMenu("选择");
eat->addAction("烤鸡");
eat->addAction(QIcon(":/Resource/women.png"), "烤鸭");
eat->addAction("烤羊");

//设置选中,默认选中
QAction* select =  eat->addAction("选择");
select->setCheckable(true);
//讲菜单添加到菜单项里面
menu->addMenu(eat);

给菜单添加快捷键

快捷键,取地址符 + 一个大写字母,然后在使用的时候按Alt键 + 字母组合

cpp 复制代码
menubar->addMenu("编辑(&B)");
menubar->addMenu("&File");

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

cpp 复制代码
// 点击QAction对象发出该信号
[signal] void QAction::triggered(bool checked = false);

1.2 工具栏

创建工具栏

cpp 复制代码
QToolBar *toolbar =  addToolBar("toolbar");

添加Aciton

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

添加Widget

cpp 复制代码
//只要是QWidget或者启子类都可以被添加
toolbar->addWidget(new QPushButton("Touch Me"));

1.3 状态栏

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

创建状态栏

  • 获取自带的状态栏
cpp 复制代码
QStatusBar* statusbar = statusBar();
  • 也可以new一个
cpp 复制代码
QStatusBar* statusbar = new QStatusBar;
this->setStatusBar(statusbar);

添加Widget

cpp 复制代码
//左边
statusbar->addWidget(new QLabel("hello"));
statusbar->addWidget(new QPushButton("status"));
//右边(Permanent永久的)
statusbar->addPermanentWidget(new QLabel("permanent"));
statusbar->addPermanentWidget(new QLabel("per"));

一些常用操作(状态切换)

cpp 复制代码
QStatusBar* status = statusBar();
//左边
status->addWidget(new QPushButton("就绪"));
status->addWidget(new QPushButton(QWidget::style()->standardPixmap(QStyle::StandardPixmap::SP_ArrowDown), "向下"));
//右边
QPushButton* btn = new QPushButton("切换");
status->addPermanentWidget(btn);

//功能:点击,切换左边状态
QObject::connect(btn, &QPushButton::clicked, [=]() {
        status->showMessage("正在加载中.....");
          //用定时器来变换状态,一秒换就绪,一秒清空
          QTimer::singleShot(1000, [=]() {
              status->showMessage("就绪");
              QTimer::singleShot(1000, [=]() {
                  status->clearMessage();
                  });
              });
          });

//状态栏信号
QObject::connect(status, &QStatusBar::messageChanged, [=](auto mess) {
          qInfo() << mess;
          });

1.4 浮动窗口

添加浮动窗口

cpp 复制代码
//看文档
QDockWidget* gitDock = new QDockWidget("Git");
QDockWidget* solveDock = new QDockWidget("解决方案管理器");
QDockWidget* teamDock = new QDockWidget("团队资源管理器");
QDockWidget* resourceDock = new QDockWidget("资源视图");

addDockWidget(Qt::DockWidgetArea::RightDockWidgetArea, gitDock);
addDockWidget(Qt::DockWidgetArea::RightDockWidgetArea,solveDock);
addDockWidget(Qt::DockWidgetArea::RightDockWidgetArea,teamDock);
addDockWidget(Qt::DockWidgetArea::RightDockWidgetArea,resourceDock);

分割浮动窗口

cpp 复制代码
splitDockWidget(gitDock,solveDock,Qt::Orientation::Horizontal);

选项卡式停靠

cpp 复制代码
tabifyDockWidget(solveDock,teamDock);
tabifyDockWidget(teamDock,resourceDock);

2,菜单

2.1 右键菜单

在桌面右击鼠标会出现菜单,这个我们一般叫做右键菜单,那么在Qt中我们如何使用右键菜单呢?

首先 需要给控件设置上下文菜单策略 setContextMenuPolicy(Qt::CustomContextMenu) 其次 设置该策略后,当我们右键点击控件时qt会发送一个信号 customContextMenuRequested(const QPoint &pos) ,其中参数pos用来传递右键点击时的鼠标的坐标,这个坐标一般是相对于控件左上角而言的最后给这个信号设置相应的槽函数,在槽函数中将菜单展示出来就行了。

  • 设置上下文菜单策略
cpp 复制代码
setContextMenuPolicy(Qt::ContextMenuPolicy::CustomContextMenu);  //一但设立了,就有默认的右键菜单
  • 连接上下文菜单触发的信号
cpp 复制代码
connect(btn,&QPushButton::customContextMenuRequested,this,[=](const QPoint&pos)
{
    //在指定位置弹出菜单
    //contextMenu->exec(btn->mapToParent(this->mapToParent(pos)));
    contextMenu->exec(QCursor::pos());
});
  • 创建的菜单
cpp 复制代码
QMenu contextMenu = new QMenu;
QAction* copyAct = contextMenu->addAction("复制");
QAction* pasteAct= contextMenu->addAction("粘贴");

案例

  • 设置上下文菜单
  • 连接信号,获取点击坐标,设置弹出菜单
cpp 复制代码
void rightMenu()
{
        //设置上下文菜单策略
        setContextMenuPolicy(Qt::ContextMenuPolicy::CustomContextMenu);
        //设置菜单
        _rightMenu = new QMenu(this);
        _rightMenu->addAction("苹果");
        _rightMenu->addAction("香蕉");
        _rightMenu->addAction("雪梨");
        _rightMenu->addAction("枣子");

        QObject::connect(this, &QWidget::customContextMenuRequested, [=](const QPoint& point) {
            qInfo() << "---------";
            //映射坐标转换
            auto p = mapToGlobal(point);
            _rightMenu->popup(p);
            });
    }
protected:
//右键菜单响应事件,但是要在没有设置上下文的情况下,否则不会触发
void contextMenuEvent(QContextMenuEvent* ev)override
{
        qDebug() << "contextMnePop";
        _rightMenu->popup(ev->globalPos());
}
private:
    QPoint m_rightMenu;
    QMenu* _rightMenu;
};
相关推荐
codkingo2 小时前
Skill:Agent 的可插拔能力单元
数据库·oracle
2301_810160952 小时前
C++中的策略模式进阶
开发语言·c++·算法
Boop_wu2 小时前
[MyBatis] MyBatis 快速入门(1)
数据库·oracle
l1t2 小时前
QWen 3.5plus总结的总结基准测试结果的正确方法
前端·数据库
额1292 小时前
CentOS 7 安装apache部署discuz导入数据库表
数据库·centos·apache
ruxingli2 小时前
GoLang的并发如何避免死锁
开发语言·后端·golang
-Rane2 小时前
【C++】map和set
开发语言·c++
keep intensify2 小时前
单源最短路径
数据结构·c++·算法
2401_873544922 小时前
分布式缓存一致性
开发语言·c++·算法