
前言:
- Qt是C++一个开发框架,具有跨平台特性。
- 这篇是作者大二学习的时候做的笔记,有可能有错误,请各位批评指正。
- 这篇记录Qt的QMainWindow,相当于给界面添加细节工具。
- 欢迎大家收藏 + 关注,作者将会持续更新。
文章目录
- [1. QMainWindow](#1. QMainWindow)
- 2,菜单
-
- [2.1 右键菜单](#2.1 右键菜单)
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;
};