当前位置: 首页 > news >正文

主窗口 (QMainWindow)

主窗口 (QMainWindow)

一. 主窗口概念

  1. 主窗口是与用户进行长时间交互的顶层窗口

  2. 程序的绝大多数功能直接由主窗口提供

  3. 主窗口通常是应用程序启动后显示的第一个窗口

  4. 整个程序由一个主窗口和多个对话框组成

    请添加图片描述

二. Qt中的主窗口(QMainWindow)

  1. QMainWindow是Qt中主窗口的基类
  2. QMainWindow继承于QWidget,是一种容器类型的组件
QObject QWidget QPaintDevice QMainWidow
  1. QMainWindow中的组件布局
    请添加图片描述

三. 主窗口中的菜单

  1. 和菜单相关的组件

    请添加图片描述

  2. 在Qt窗口中创建菜单 请添加图片描述

    #ifndef MAINWINDOW_H
    #define MAINWINDOW_H
    
    #include <QMainWindow>
    
    #include <QKeySequence>
    #include <QMenuBar>
    #include <QAction>
    
    class MainWindow : public QMainWindow
    {
        Q_OBJECT
    
    private:
        MainWindow();
        MainWindow(const MainWindow&);
        MainWindow& operator= (const MainWindow&);
    
        bool construct();
        bool initMenuBar();
        bool initFileMenu(QMenuBar* mb);
        bool makeAction(QAction*& action, QString text, int key);
    public:
        static MainWindow* NewInstance();  //二次构造
        ~MainWindow();
    };
    #endif // MAINWINDOW_H
    
    
    #include "MainWindow.h"
    #include "ui_MainWindow.h"
    #include <QMenu>
    
    MainWindow::MainWindow()
    {
    
    }
    
    
    //由于主窗口这个包含很多组件,这里采用二次构造,防止构造过程中某个组件没有正常构造出来,把之前构造的组件销毁掉,防止内存泄漏
    MainWindow* MainWindow::NewInstance()
    {
        MainWindow* ret = new MainWindow();
    
        if( (ret == NULL) || !ret->construct() )
        {
            delete ret;
            ret = NULL;
        }
    
        return ret;
    }
    
    //主窗口的构造函数
    bool MainWindow::construct()
    {
        bool ret = true;
    
        //初始化菜单栏,菜单栏由下拉菜单组组成
        ret = ret && initMenuBar();
    
        return ret;
    }
    
    //初始化菜单栏
    bool MainWindow::initMenuBar()
    {
        bool ret = true;
        QMenuBar* mb = menuBar();
    
        //初始化下拉菜单组,下拉菜单组由菜单项组成
        ret = ret && initFileMenu(mb);
    
        return ret;
    }
    
    //初始化下拉菜单组
    bool MainWindow::initFileMenu(QMenuBar* mb)
    {
        //定义菜单项
        QMenu* menu = new QMenu("File(&F)");
        bool ret = (menu != NULL);
    
        if( ret )
        {
            QAction* action = NULL;
    
            ret = ret && makeAction(action, "New(N)", Qt::CTRL + Qt::Key_N);
    
            if( ret )
            {
                menu->addAction(action);    // add Action item to Menu
            }
    
            menu->addSeparator();
    
            //传参的方式构造菜单项
            ret = ret && makeAction(action, "Exit(X)", Qt::CTRL + Qt::Key_X);
    
            if( ret )
            {
                menu->addAction(action);    // add Action item to Menu
            }
        }
    
        if( ret )
        {
            mb->addMenu(menu);    // add Menu add to application Menu Bar
        }
        else
        {
            delete menu;
        }
    
    
        return ret;
    }
    
    
    //构造菜单项,
    bool MainWindow::makeAction(QAction*& action, QString text, int key)
    {
        bool ret = true;
    
        action = new QAction(text, NULL);
    
    
        if( action != NULL )
        {
            //设置菜单项的快捷键
            action->setShortcut(QKeySequence(key));
        }
        else
        {
            ret = false;
        }
    
        return ret;
    }
    
    MainWindow::~MainWindow()
    {
    
    }
    
    
    #include "MainWindow.h"
    
    #include <QApplication>
    #include<QMainWindow>
    
    int main(int argc, char *argv[])
    {
        QApplication a(argc, argv);
    
        MainWindow* w = MainWindow::NewInstance();
        int ret = -1;
    
        if( w != NULL )
        {
            w->show();
    
            ret = a.exec();
        }
    
        return a.exec();
    }
    
    

四. 主窗口中的工具栏

  1. 概念和意义

    应用程序中继承各种功能实现快捷使用的一个区域

    工具栏并不是应用程序中必须存在的组件

    工具栏中的元素可以是各种窗口组件

    工具栏中的元素通常以图标按钮的方式存在

  2. 和工具栏相关的类组件
    请添加图片描述

  3. 实验

    #ifndef MAINWINDOW_H
    #define MAINWINDOW_H
    
    #include <QMainWindow>
    
    #include <QKeySequence>
    #include <QMenuBar>
    #include <QAction>
    
    class MainWindow : public QMainWindow
    {
        Q_OBJECT
    
    public:
        MainWindow(QWidget *parent = 0);
        ~MainWindow();
    };
    #endif // MAINWINDOW_H
    
    
    #include "MainWindow.h"
    #include "ui_MainWindow.h"
    #include <QMenu>
    #include <QToolBar>
    #include <QAction>
    #include <QIcon>
    #include <QPushButton>
    #include <QLabel>
    #include <QLineEdit>
    
    MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent)
    {
        QToolBar* tb = addToolBar("Tool Bar");
        QAction* action = new QAction("", NULL);
    
        tb->setFloatable(false);
        tb->setMovable(false);
    
        action->setToolTip("Open");
        action->setIcon(QIcon(":/img/open.png"));
    
        tb->addAction(action);
    
        QPushButton* b = new QPushButton("Button");
     //   QLabel* l = new QLabel("Label");
       // QLineEdit* e = new QLineEdit();
    
        tb->addWidget(b);
     //  tb->addWidget(l);
      //  tb->addWidget(e);
    }
    
    MainWindow::~MainWindow()
    {
    
    }
    
    

    请添加图片描述

五. 主窗口的状态栏

  1. 概念和意义

    状态栏是应用程序输出简要信息的区域

    状态栏一般位于主窗口的最底部

    状态栏中的消息类型有:实时消息(例:当前程序状态)、永久消息(例:程序版本号)、进度消息(例:进度条提示)
    请添加图片描述

  2. 实验

    #ifndef MAINWINDOW_H
    #define MAINWINDOW_H
    
    #include <QMainWindow>
    
    #include <QKeySequence>
    #include <QMenuBar>
    #include <QAction>
    
    class MainWindow : public QMainWindow
    {
        Q_OBJECT
    
    public:
        MainWindow(QWidget *parent = 0);
        ~MainWindow();
    };
    #endif // MAINWINDOW_H
    
    
    #include "MainWindow.h"
    #include "ui_MainWindow.h"
    #include <QMenu>
    #include <QToolBar>
    #include <QAction>
    #include <QIcon>
    #include <QPushButton>
    #include <QLabel>
    #include <QLineEdit>
    
    MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent)
    {
        QStatusBar* sb = statusBar();
        QLabel* l = new QLabel("Label");
        QLineEdit* e = new QLineEdit();
        QPushButton* b = new QPushButton("Button");
    
        sb->addPermanentWidget(l);
        sb->addPermanentWidget(e);
        sb->addPermanentWidget(b);
    
        sb->showMessage("Andrea");
    }
    
    MainWindow::~MainWindow()
    {
    
    }
    
    

    请添加图片描述

相关文章:

  • C++中的explicit
  • Qt中的事件处理
  • 使用二阶构造实现计算器页面的构造过程
  • Linux内核的CodingStyle
  • 常见面试题及面试准备阶段要思考的问题
  • Qt中事件的传递过程
  • Qt事件初探-发现事件
  • Qt中TCP通信的实现
  • ubuntu下MQTT的移植安装
  • MQTT协议 发布/订阅 机制初探 - (模拟物联网传感器设备和控制模块间的通信)
  • MQTT初探
  • VScode快捷键
  • Linux C的MQTT测试代码编写 - 跨主机的MQTT客户端通信
  • Linux系统嵌入式设备的串口通信
  • Anaconda在Windows的安装
  • [数据结构]链表的实现在PHP中
  • [译] 怎样写一个基础的编译器
  • 【347天】每日项目总结系列085(2018.01.18)
  • Android路由框架AnnoRouter:使用Java接口来定义路由跳转
  • Angular2开发踩坑系列-生产环境编译
  • JavaScript标准库系列——Math对象和Date对象(二)
  • js对象的深浅拷贝
  • JS字符串转数字方法总结
  • Spring Cloud Feign的两种使用姿势
  • spring学习第二天
  • use Google search engine
  • Vue小说阅读器(仿追书神器)
  • 微服务框架lagom
  • 微信开源mars源码分析1—上层samples分析
  • - 转 Ext2.0 form使用实例
  • “十年磨一剑”--有赞的HBase平台实践和应用之路 ...
  • Redis4.x新特性 -- 萌萌的MEMORY DOCTOR
  • # Pytorch 中可以直接调用的Loss Functions总结:
  • #我与Java虚拟机的故事#连载07:我放弃了对JVM的进一步学习
  • (8)Linux使用C语言读取proc/stat等cpu使用数据
  • (Bean工厂的后处理器入门)学习Spring的第七天
  • (C)一些题4
  • (windows2012共享文件夹和防火墙设置
  • (非本人原创)我们工作到底是为了什么?​——HP大中华区总裁孙振耀退休感言(r4笔记第60天)...
  • (四)TensorRT | 基于 GPU 端的 Python 推理
  • (未解决)jmeter报错之“请在微信客户端打开链接”
  • (转)原始图像数据和PDF中的图像数据
  • (转载)微软数据挖掘算法:Microsoft 时序算法(5)
  • (轉貼) 蒼井そら挑戰筋肉擂台 (Misc)
  • .bat批处理(九):替换带有等号=的字符串的子串
  • .NET 3.0 Framework已经被添加到WindowUpdate
  • .NET 8 编写 LiteDB vs SQLite 数据库 CRUD 接口性能测试(准备篇)
  • .NET WebClient 类下载部分文件会错误?可能是解压缩的锅
  • .NET/C# 阻止屏幕关闭,阻止系统进入睡眠状态
  • .net和php怎么连接,php和apache之间如何连接
  • .NET与 java通用的3DES加密解密方法
  • .net中生成excel后调整宽度
  • @SentinelResource详解
  • @Tag和@Operation标签失效问题。SpringDoc 2.2.0(OpenApi 3)和Spring Boot 3.1.1集成
  • [ C++ ] STL---string类的使用指南