主窗口 (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()
    {
    
    }
    
    

    请添加图片描述

  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
你可以使用QLabel控件来实现给绘图区域命名的功能。具体的做法是: 1. 在QMainWindow中添加QLabel控件,设置其文本为对应绘图区域的名称; 2. 使用QGridLayout的addWidget方法将绘图区域和对应的QLabel控件添加到QMainWindow中; 3. 设置QGridLayout中QLabel控件的位置,让其出现在对应的绘图区域上方。 以下是一个示例代码,其中我添加了两个绘图区域,分别命名为"Plot1"和"Plot2": ```python import sys from PyQt5.QtWidgets import QApplication, QMainWindow, QLabel, QGridLayout, QWidget, QSizePolicy from PyQt5.QtCore import Qt from matplotlib.backends.backend_qt5agg import FigureCanvasQTAgg as FigureCanvas from matplotlib.figure import Figure class MainWindow(QMainWindow): def __init__(self): super().__init__() self.setWindowTitle("Plot Window") # 创建两个绘图区域 self.plot1 = PlotWidget() self.plot2 = PlotWidget() # 创建两个QLabel控件 self.label1 = QLabel("Plot1") self.label2 = QLabel("Plot2") # 设置QLabel控件的位置,让其出现在绘图区域上方 self.grid = QGridLayout() self.grid.addWidget(self.label1, 0, 0) self.grid.addWidget(self.plot1, 1, 0) self.grid.addWidget(self.label2, 2, 0) self.grid.addWidget(self.plot2, 3, 0) # 创建一个QWidget,将QGridLayout添加到QWidget中 widget = QWidget() widget.setLayout(self.grid) self.setCentralWidget(widget) class PlotWidget(FigureCanvas): def __init__(self): # 创建一个Figure对象 self.fig = Figure() # 调用FigureCanvas的构造函数,将Figure对象传递给它 super().__init__(self.fig) # 创建一个Axes对象 self.ax = self.fig.add_subplot(111) # 在Axes对象上绘制一个简单的曲线 self.ax.plot([0, 1, 2, 3, 4, 5, 6, 7, 8, 9], [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]) # 设置FigureCanvas的大小策略为Expanding,让它可以随着窗口大小的改变而改变大小 self.setSizePolicy(QSizePolicy.Expanding, QSizePolicy.Expanding) # 将Figure对象的背景色设置为白色 self.fig.patch.set_facecolor('white') # 将Axes对象的坐标轴设置为黑色 self.ax.spines['bottom'].set_color('black') self.ax.spines['top'].set_color('black') self.ax.spines['left'].set_color('black') self.ax.spines['right'].set_color('black') # 将Axes对象的坐标轴标签设置为黑色 self.ax.tick_params(axis='x', colors='black') self.ax.tick_params(axis='y', colors='black') if __name__ == '__main__': app = QApplication(sys.argv) mainWindow = MainWindow() mainWindow.show() sys.exit(app.exec_()) ``` 在这个示例中,我使用了QGridLayout将两个绘图区域和对应的QLabel控件添加到了QMainWindow中,并设置了QLabel控件的位置,让其出现在对应的绘图区域上方。同时,我还创建了一个PlotWidget类,用来绘制一个简单的曲线。你可以根据自己的需求修改这个示例代码。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值