• 【Qt开发流程】之程序主窗口


    描述

    就目前的应用程序而言,一般包含菜单栏、工具栏、状态栏、中央区域等。
    qt窗口部件类图如下:
    在这里插入图片描述
    一个主窗口提供了一个构建应用程序用户界面的框架。
    Qt有QMainWindow及其相关类来管理主窗口。
    QMainWindow有自己的布局,可以向其中添加QToolBars、QDockWidgets、QMenuBar和QStatusBar。布局有一个中心区域,可以被任何类型的小部件占用。
    可以看到以下布局的图像。
    在这里插入图片描述

    菜单栏

    菜单栏(QMenu)是一个包含下拉菜单的列表,由QAction动作类实现。
    Qt在QMenu中实现菜单,而QMainWindow将它们保留在QMenuBar中。将QActions添加到菜单中,它们会显示为菜单项。
    可以通过调用menuBar()来向主窗口的菜单栏添加新菜单,该函数返回窗口的QMenuBar,然后使用QMenuBar::addMenu()添加菜单。
    QMainWindow带有默认的菜单栏,但也可以使用setMenuBar()自己设置一个菜单栏。如果希望实现自定义菜单栏(即不使用QMenuBar小部件),则可以使用setMenuWidget()进行设置。
    以下是创建菜单的示例:

    void MainWindow::createMenus()
    {
        fileMenu = menuBar()->addMenu(tr("&File"));
        fileMenu->addAction(newAct);
        fileMenu->addAction(openAct);
        fileMenu->addAction(saveAct);
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    createPopupMenu()函数在主窗口接收上下文菜单事件时创建弹出菜单。默认实现会生成一个包含停靠窗口和工具栏的可选操作的菜单。可以为自定义菜单重新实现createPopupMenu()。
    可以在设计师直接输入菜单
    在这里插入图片描述
    可以在动作区添加动作,可以添加图标,动作可以复用,在菜单栏和工具栏添加。
    在这里插入图片描述

    工具栏

    工具栏在QToolBar类中实现。可以使用addToolBar()将工具栏添加到主窗口中。
    通过将工具栏分配到特定的Qt::ToolBarArea,可以控制工具栏的初始位置。可以通过使用addToolBarBreak()或insertToolBarBreak()插入工具栏断点来分割一个区域,类似于文本编辑中的换行符。还可以使用QToolBar::setAllowedAreas()和QToolBar::setMovable()限制用户在何处放置工具栏。
    可以使用iconSize()检索工具栏图标的大小。这些大小取决于平台;可以使用setIconSize()设置固定大小。可以使用setToolButtonStyle()更改工具栏中所有工具按钮的外观。
    以下是创建工具栏的示例:

    void MainWindow::createToolBars()
    {
        fileToolBar = addToolBar(tr("File"));
        fileToolBar->addAction(newAct);
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5

    在这里插入图片描述

    状态栏

    可以使用setStatusBar()设置状态栏,但是第一次调用statusBar()(返回主窗口的状态栏)时会自动创建一个状态栏。

    ui->statusBar->showMessage("helloworld");
    
    • 1

    在这里插入图片描述

    中央区域

    一个主窗口可以放置一个中心部件。使用setCentralWidget(QWidget *widget)方法设置。

    setCentralWidget(new QTextEdit);
    
    • 1

    在这里插入图片描述

    dock区域

    Dock widgets是使用QDockWidget类实现的。dock widget是一个可以停靠在主窗口的窗口。可以使用addDockWidget()将dock widget添加到主窗口中。
    根据Qt :: DockWidgetArea枚举,有四个dock widget区域:左、右、上和下。可以使用setCorner()指定应占用区域重叠处角落的dock widget区域。默认情况下,每个区域只能包含一个dock widget行(垂直或水平),但如果使用setDockNestingEnabled()启用嵌套,则dock widget可以沿任一方向添加。
    两个dock widget也可能堆叠在一起。然后使用QTabBar选择应显示哪个窗口部件。
    下面是一个创建和添加dock widget到主窗口的示例代码:

        QDockWidget *dockWidget = new QDockWidget(tr("Dock Widget"), this);
        dockWidget->setAllowedAreas(Qt::LeftDockWidgetArea | Qt::RightDockWidgetArea);
        dockWidget->setWidget(dockWidgetContents);
        addDockWidget(Qt::LeftDockWidgetArea, dockWidget);
    
    • 1
    • 2
    • 3
    • 4

    工具栏添加弹出式菜单

        QMenu* pM = new QMenu();
        pM->addAction(new QAction("123", this));
        pM->addAction(new QAction("123", this));
    
        QToolButton* pT = new QToolButton;
        pT->setMenu(pM);
        pT->setPopupMode(QToolButton::MenuButtonPopup);
    
        ui->mainToolBar->addWidget(pT);
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    在这里插入图片描述

    状态栏显示永久消息

    ui->statusBar->addPermanentWidget(new QLabel("helloworld"));
    
    • 1

    显示在右侧,不会被左侧的临时消息覆盖。
    在这里插入图片描述

    自定义菜单

    通过QWidgetAction类可以创建自定义菜单。
    QWidgetAction类通过接口扩展了QAction,用于将自定义小部件插入到基于操作的容器(例如工具栏)中。
    应用程序中的大多数操作都表示为菜单中的项目或工具栏中的按钮。但是,有时需要更复杂的小部件。例如,文字处理器中的缩放操作可以使用QToolBar中的QComboBox实现,以呈现不同缩放级别的范围。QToolBar提供了QToolBar :: insertWidget()作为方便函数,用于插入单个小部件。但是,如果想要实现使用自定义小部件在多个容器中进行可视化的操作,则必须子类化QWidgetAction。
    例如,如果在将QWidgetAction添加到QToolBar中,则将调用QWidgetAction :: createWidget()。该函数的重新实现应该使用指定的父项创建一个新的自定义小部件。
    如果从容器小部件中删除操作,则调用QWidgetAction :: deleteWidget(),并将先前创建的自定义小部件作为参数。默认实现隐藏小部件,并使用QObject :: deleteLater()将其删除。
    如果只有一个单独的自定义小部件,则可以使用setDefaultWidget()设置为默认小部件。
    如果将操作添加到QToolBar中,或者通常将其添加到支持QWidgetAction的操作容器中,则将使用该部件。
    如果在同一时间将只有默认小部件的QWidgetAction添加到两个工具栏中,则默认小部件仅显示在添加操作的第一个工具栏中。
    QWidgetAction接管了默认小部件的所有权。
    请注意,激活操作取决于小部件,例如通过重新实现鼠标事件处理程序并调用QAction :: trigger()来激活操作。

    QWidget* MyAction::createWidget(QWidget *parent)
    {
        QWidget* pW = new QWidget(parent);
        QLabel* pLabel = new QLabel("哈哈");
    
        QLineEdit* pLE = new QLineEdit();
        QHBoxLayout* pHB = new QHBoxLayout();
        pHB->addWidget(pLabel);
        pHB->addWidget(pLE);
        pW->setLayout(pHB);
    
        return pW;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13

    在这里插入图片描述

  • 相关阅读:
    Gin中间件
    网络工程师回顾学习(第二部分)
    Docker 入门指南
    gitlab--基础--4.4--CICD--runner--配置
    人工智能之地形导航系统
    Redis中的数据类型
    使用KNN进行手写体识别和iris数据集分类
    【牛客网-公司真题-前端入门篇】——如何快速上手牛客
    Spring-IOC配置-bean
    利用特殊反序列化组件攻击原生反序列化入口
  • 原文地址:https://blog.csdn.net/MrHHHHHH/article/details/134498052