9 QT的窗口系统-QMainWindow

2023-11-01

QMainWindow是一个为用户提供主窗口程序的类,包含一个菜单栏(menu bar)、多个工具栏(tool bars)、多个浮动窗口(dock widgets)、一个状态栏(status bar)及一个中心部件(central widget),是许多应用程序的基础,如文本编辑器,图片编辑器等。

需要特别说明的一个函数为:

void QMainWindow::setCentralWidget(QWidget * widget);设置某个控件为窗口的核心控件。

1、菜单栏

一个主窗口最多只有一个菜单栏。位于主窗口顶部、主窗口标题栏下面,使用前需要添加头文件<QMenuBar>、<QMenu>、<QAction>。

1、创建菜单栏,通过QMainWindow类的menubar()函数获取主窗口菜单栏指针

QMenuBar * menuBar() const

2、创建菜单,调用QMenu的成员函数addMenu来添加菜单

/* 添加一个已创建完毕的菜单项 */
QAction* addMenu(QMenu * menu)

/* 添加一个标题为title的菜单项 */
QMenu* addMenu(const QString & title)

/* 添加一个图标为icon,标题为title的菜单项 */
QMenu* addMenu(const QIcon & icon, const QString & title)

3、创建菜单项,调用QMenu的成员函数addAction来添加菜单项

QAction* activeAction() const

QAction* addAction(const QString & text)

QAction* addAction(const QIcon & icon, const QString & text)

QAction* addAction(const QString & text, const QObject * receiver,
 const char * member, const QKeySequence & shortcut = 0)

QAction* addAction(const QIcon & icon, const QString & text, 
  const QObject * receiver, const char * member,const QKeySequence & shortcut = 0) 

4、添加分割线

添加分割线使用的是QMenu类的addSeparator()函数。

示例代码如下:
#include <QMenuBar>
#include <QMenu>
#include <QAction>


 /* 添加菜单栏 */
QMenuBar* mBar = menuBar();

/*添加文件菜单项*/
QMenu* pFile = mBar->addMenu("文件");
    
/*添加视图菜单项*/
QMenu* pView = mBar->addMenu("视图");

/*在文件菜单项中添加新建操作*/
QAction*pNew = pFile->addAction("新建");

/*在文件菜单项中添加打开操作*/
QAction*pOpen = pFile->addAction("打开");

/*使用Lambda表达式关联信号与槽*/
connect(pNew,&QAction::triggered,
            [=]()
            {
                qDebug()<<"hhhhhh";
            }
            );

 /* 添加分割线 */
 pFile->addSeparator();

2、工具栏

主窗口的工具栏上可以有多个工具条,通常采用一个菜单对应一个工具条的的方式,也可根据需要进行工具条的划分,使用前需要添加头文件<QToolBar>。

1、直接调用QMainWindow类的addToolBar()函数获取主窗口的工具条对象,每增加一个工具条都需要调用一次该函数。

2、在工具条上添加操作,通过QToolBar类的addAction函数添加。

3、使用setAllowedAreas()函数指定停靠区域:

Qt::LeftToolBarArea    停靠在左侧
Qt::RightToolBarArea   停靠在右侧
Qt::BottomToolBarArea  停靠在底部
Qt::TopToolBarArea     停靠在顶部
Qt::AllToolBarAreas    以上四个位置都可停靠

4、使用setMoveable()函数设定工具栏的可移动性

示例代码如下:

/* 为主窗口添加工具条 */
QToolBar* toolBar = addToolBar("工具条");

/* 通过addAction函数在工具条上新加QAction对象 */
toolBar->addAction(pNew);

QPushButton* b = new QPushButton(this);
b->setText("按钮");

/* 通过addWidget函数在工具条上新加按钮b */
toolBar->addWidget(b);

/* 设置工具条只能移动时只能停留在左侧区域,注意初始区域仍在顶部 */
toolBar->setAllowedAreas(Qt::LeftToolBarArea);

/* 设置工具条不可移动 */
toolBar->setMovable(false);

3、状态栏

使用状态栏之前需要添加头文件<QStatusBar>。

1、直接调用QMainWindow类的statusBar()函数获取主窗口的状态栏对象,每增加一个工具条都需要调用一次该函数。

2、添加小部件:void addWidget(QWidget * widget, int stretch = 0)

3、插入小部件:int insertWidget(int index, QWidget * widget, int stretch = 0)

4、删除小部件:void removeWidget(QWidget * widget)

示例代码如下:

    /* 添加一个状态栏 */
    QStatusBar* sBar = statusBar();

    /* 新建一个QLabel对象,用于显示文本 */
    QLabel* label = new QLabel(this);
    label->setText("左侧");

    /* 在状态栏从左往右加入该QLabel对象 */
    sBar->addWidget(label);

    /* 在状态栏从右往左加入QLabel对象 */
    sBar->addPermanentWidget(new QLabel("右侧",this));

    QLabel* k = new QLabel(this);
    k->setText("最左侧");

    /* 在最左侧即编号为0的地方加入部件k */
    sBar->insertWidget(0,k);

    /* 移除状态栏中的label控件 */
    sBar->removeWidget(label);

4、浮动窗口

使用浮动窗口需要新加头文件<QDockWidget>。

1、直接调用void QMainWindow::addDockWidget(Qt::DockWidgetArea area, QDockWidget * dockwidget)函数可以为主窗口新加一个浮动窗口,其中Qt::DockWidgetArea area的可用值如下:

    enum DockWidgetArea {
        LeftDockWidgetArea = 0x1,     //悬浮在左侧
        RightDockWidgetArea = 0x2,    //悬浮在右侧
        TopDockWidgetArea = 0x4,      //悬浮在顶部
        BottomDockWidgetArea = 0x8,   //悬浮在底部

        DockWidgetArea_Mask = 0xf,     
        AllDockWidgetAreas = DockWidgetArea_Mask,
        NoDockWidgetArea = 0          //无悬浮框
    };

示例代码如下:

    /* 创建一个浮动窗口对象 */
    QDockWidget* dock = new QDockWidget(this);

    /* 将浮动窗口dock添加到主窗口的右侧区域,注意,可以拖动的 */
    addDockWidget(Qt::RightDockWidgetArea,dock);

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

9 QT的窗口系统-QMainWindow 的相关文章

随机推荐

  • blender学习记录2--常见的问题

    视图问题 镜头无法放大 有两个体积相差较大的物体 滚轮无法将较小的那个很好的显示出来 解决方法 将鼠标放到较小的物体上 按照 不放 选择查看所选 就能进行正常缩放 视图问题 视图旋转偏移 选中了一个相距较远的物体 旋转并非以当前物体为中心
  • MATLAB——最小二乘法拟合指数函数“y=Ae^Bx”

    一 相关函数 1 MATLAB中polyfit函数是用来进行多项式拟合的 其数学原理是基于最小二乘法进行拟合的 具体使用语法是 p polyfit x y n 其中x y表示需要拟合的坐标点 大小需要一样 n表示多项式拟合的次数 返回值p表
  • Google也裁员啦!!

    国外媒体报道 在谷歌 要不就不下雨 要下就是倾盆大雨 google宣布首次裁员 裁减内部员工100个 合同工和劳务工都将裁掉 挪威 瑞典 奥斯汀 得克萨斯 等分部将全部关闭 分部员工全部回美国总部 谷歌还发表数篇博客 详细说明了即将关闭的多
  • select,poll,epoll优缺点及比较

    在之前我已经分析了这三个函数 请看我之前的文章 IO多路复用之select函数详解 IO多路复用之poll函数详解 IO多路复用之epoll函数详解 这篇文章只总结优缺点 以便面试时回答 select优点 1 select 的可移植性更好
  • 逆向分析脱壳

    1 用PEiD查壳 UPX或者FSG PECompact ASPack 2 12 2 使用OD载入程序 第一个为入口点 3 手动寻找OEP 一 查找尾部跳转指令 通常情况下 它是一条jmp指令 这条指令的后面 存在着非常多的0x00字节 我
  • 17.Xaml DockPanel控件 ---> 停靠面板

    1 运行效果 2 运行源码 a Xaml源码
  • 【计算机视觉

    文章目录 一 分割 语义相关 16篇 1 1 Test time augmentation based active learning and self training for label efficient segmentation 1
  • .net 在js中判断checkboxlist是否有选中

    在提交添加或修改内容时 需要对关键数据进行判空处理 如何在js中判断checkboxlist是否有选择项呢 具体操作如下 var CheckBox document getElementById getElementsByTagName I
  • b树和b+树的区别

    一 b树 b树 balance tree 和b 树应用在数据库索引 可以认为是m叉的多路平衡查找树 但是从理论上讲 二叉树查找速度和比较次数都是最小的 为什么不用二叉树呢 因为我们要考虑磁盘IO的影响 它相对于内存来说是很慢的 数据库索引是
  • OBS虚拟摄像头没有声音

    点击上方编辑 高级音频属性 打开对应的视频源音频监听
  • 原型模式例题——订单处理系统

    文章目录 原型模式例题 订单处理系统 思路 UML 图 代码 产品类 订单类 客户端 原型模式例题 订单处理系统 现在有一个订单处理系统 里面有一个保存订单的业务功能 需求 每当订单的预定产品数量超过1000的时候 就需要把你单拆成两份订单
  • B - Polycarp‘s Practice

    Polycarp is practicing his problem solving skill He has a list of nn problems with difficulties a 1 a 2 dots a na1 a2 an
  • 【蓝桥杯】01背包问题

    一 问题描述 有 N 个物品 并且每个物品都有一个重量 W 和一个价值 V 你有一个能装 M 重量的背包 问怎么装才能使所装的价值最大 每个物品只有一个 输入 输入的第一行包含两个整数 n m 分别表示物品的个数和背包能装的重量 以后N行每
  • xcode iphone messagebox

    Show a main window message box Alert View will automatically adjust for landscape orientation UIAlertView alert UIAlertV
  • crm客户管理是什么 好的销售crm具备哪些特点

    近年来crm日益流行 也得到了越来越多企业的重视 crm的C是Customer R代表Relationship M是Management 也就是客户关系管理 什么是crm客户管理呢 crm也是一种管理软件 是一种以信息技术为手段 有效提高企
  • ExMobi文档

    EXmobi官方文档 ExMobi 从入门到精通 本书电子版和示例代码请访问GIT仓库 https github com nandy007 ExMobiBeginnerBook ExMobi门户 http www exmobi cn ExM
  • Django 简单教程(入门级)

    一 Django简介 1 web框架介绍 具体介绍Django之前 必须先介绍WEB框架等概念 web框架 别人已经设定好的一个web网站模板 你学习它的规则 然后 填空 或 修改 成你自己需要的样子 一般web框架的架构是这样的 其它基于
  • 数字电路设计之加法器的实现

    今天在看博客的时候看到有一种新颖的加法器写法 这和之前的超前进位加法器 二进制加法器不同 这个加法器应用了循环 我觉得应该会综合出来一个很差的东西 然后我试了一下 代码 module adder x y cin sum cout param
  • ubuntu登录输入密码后无法进入系统,重新返回输入密码界面(已解决)

    修改 etc profile时 由于未知问题导致无法使用ls等命令 重启后输入密码无法进入Ubuntu系统 反复回到输入密码界面 解决方法 1 按下Ctrl Alt F1 输入用户名 密码 2 输入 export PATH usr loca
  • 9 QT的窗口系统-QMainWindow

    QMainWindow是一个为用户提供主窗口程序的类 包含一个菜单栏 menu bar 多个工具栏 tool bars 多个浮动窗口 dock widgets 一个状态栏 status bar 及一个中心部件 central widget