1、QMainWindow_菜单栏与工具栏

在 Qt 中,QMainWindow 是一个提供标准应用程序窗口框架的类,它内置了菜单栏(Menu Bar)、工具栏(Tool Bar)、状态栏(Status Bar)等组件,方便开发者快速构建具有标准结构的桌面应用。

1.1 菜单栏(Menu Bar)

菜单栏位于窗口顶部,通常包含一系列菜单(如 “文件”、“编辑”、“帮助” 等),每个菜单下可添加多个菜单项(Action),用于触发具体功能。
QMainWindow 自带菜单栏,可通过 menuBar() 方法获取。
菜单通过 QMenu 创建,菜单项通过 QAction 创建。
菜单项可设置图标、快捷键,并通过信号槽关联具体功能。

1.2 工具栏(Tool Bar)

工具栏通常包含常用功能的快捷按钮,可停靠在窗口边缘或浮动显示,提升操作效率。
通过 QToolBar 类创建,需调用 QMainWindow::addToolBar() 添加到主窗口。
工具栏可添加 QAction(与菜单栏共享),也可添加其他控件(如按钮、输入框)。
可通过 setAllowedAreas() 设置允许停靠的区域,通过 setFloatable() 控制是否可浮动。

// main.cpp
#include "mainwindow.h"
#include <QApplication>

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    MainWindow w;
    w.show();
    return a.exec();
}
    

// mainwindow.h
#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>
#include <QAction>
#include <QToolBar>
#include <QMessageBox>

class MainWindow : public QMainWindow
{
    Q_OBJECT

public:
    MainWindow(QWidget *parent = nullptr);
    ~MainWindow();

private slots:
    // 槽函数声明
    void newFile();
    void openFile();
    void showAbout();

private:
    // 动作声明
    QAction *newAction;
    QAction *openAction;
    QAction *exitAction;
    QAction *aboutAction;
    
    // 工具栏声明
    QToolBar *fileToolBar;
    
    // 初始化函数
    void createActions();
    void createMenus();
    void createToolBars();
};
#endif // MAINWINDOW_H
    

// mainwindow.cpp
#include "mainwindow.h"
#include <QMenuBar>
#include <QMessageBox>
#include <QToolBar>
#include <QStatusBar>

MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
{
    // 设置窗口基本属性
    setWindowTitle(tr("菜单栏与工具栏示例"));
    setGeometry(100, 100, 800, 600); // 位置(x,y)和大小(width,height)
    
    // 初始化状态栏
    statusBar()->showMessage(tr("就绪"));
    
    // 创建动作、菜单和工具栏
    createActions();
    createMenus();
    createToolBars();
}

MainWindow::~MainWindow()
{
    // Qt的对象树会自动管理内存,无需手动删除
}

void MainWindow::createActions()
{
    // 新建动作
    newAction = new QAction(tr("新建(&N)"), this);
    newAction->setIcon(QIcon("icons/new.png")); // 图标(实际使用时替换为真实路径)
    newAction->setShortcut(tr("Ctrl+N"));
    newAction->setStatusTip(tr("新建文件"));
    connect(newAction, &QAction::triggered, this, &MainWindow::newFile);
    
    // 打开动作
    openAction = new QAction(tr("打开(&O)"), this);
    openAction->setIcon(QIcon("icons/open.png"));
    openAction->setShortcut(tr("Ctrl+O"));
    openAction->setStatusTip(tr("打开文件"));
    connect(openAction, &QAction::triggered, this, &MainWindow::openFile);
    
    // 退出动作
    exitAction = new QAction(tr("退出(&X)"), this);
    exitAction->setIcon(QIcon("icons/exit.png"));
    exitAction->setShortcut(tr("Ctrl+Q"));
    exitAction->setStatusTip(tr("退出应用"));
    connect(exitAction, &QAction::triggered, this, &QWidget::close);
    
    // 关于动作
    aboutAction = new QAction(tr("关于(&A)"), this);
    aboutAction->setStatusTip(tr("关于本应用"));
    connect(aboutAction, &QAction::triggered, this, &MainWindow::showAbout);
}

void MainWindow::createMenus()
{
    // 创建"文件"菜单
    QMenu *fileMenu = menuBar()->addMenu(tr("文件(&F)"));
    fileMenu->addAction(newAction);
    fileMenu->addAction(openAction);
    fileMenu->addSeparator(); // 添加分隔线
    fileMenu->addAction(exitAction);
    
    // 创建"帮助"菜单
    QMenu *helpMenu = menuBar()->addMenu(tr("帮助(&H)"));
    helpMenu->addAction(aboutAction);
}

void MainWindow::createToolBars()
{
    // 创建工具栏
    fileToolBar = addToolBar(tr("文件操作"));
    fileToolBar->addAction(newAction);
    fileToolBar->addAction(openAction);
    fileToolBar->addSeparator();
    fileToolBar->addAction(exitAction);
    
    // 设置工具栏属性
    fileToolBar->setAllowedAreas(Qt::LeftToolBarArea | Qt::RightToolBarArea | Qt::TopToolBarArea);
    fileToolBar->setFloatable(true); // 允许浮动
    fileToolBar->setMovable(true);   // 允许移动
}

// 新建文件槽函数实现
void MainWindow::newFile()
{
    QMessageBox::information(this, tr("提示"), tr("新建文件功能待实现"));
}

// 打开文件槽函数实现
void MainWindow::openFile()
{
    QMessageBox::information(this, tr("提示"), tr("打开文件功能待实现"));
}

// 显示关于信息槽函数实现
void MainWindow::showAbout()
{
    QMessageBox::about(this, tr("关于"), tr("菜单栏与工具栏示例\n版本:1.0.0"));
}
    

2、QMainWindow_状态栏、铆接部件、核心部件

在 Qt 中,QMainWindow 作为标准主窗口框架,除了菜单栏和工具栏,还包含三个核心组成部分:状态栏(Status Bar)、铆接部件(Dock Widget) 和核心部件(Central Widget)。它们共同构成了主窗口的完整结构,各自承担不同功能。

2.1.、状态栏(Status Bar)

状态栏位于窗口底部,用于显示临时状态信息(如操作提示)或永久信息(如坐标、进度)。
QMainWindow 自带状态栏,通过 statusBar() 方法获取。
可通过 showMessage() 显示临时消息(默认 3 秒后消失),或添加永久部件(如 QLabel、QProgressBar)。

2.2.、铆接部件(QDockWidget)

铆接部件(也称为 “停靠窗口”)是可停靠在主窗口边缘或浮动的独立部件,用于放置辅助功能(如工具面板、属性列表)。
特点:可拖动、可停靠(左 / 右 / 上 / 下)、可浮动,增强界面灵活性。
通过 QDockWidget 类创建,调用 addDockWidget() 方法添加到主窗口。
可通过 setAllowedAreas() 限制停靠区域,setFeatures() 控制是否可关闭 / 浮动。

2.3.、核心部件(Central Widget)

核心部件是 QMainWindow 的中心内容区域,用于放置应用程序的主要功能组件(如文本编辑器、图表、表格等)。
必须存在:一个 QMainWindow 只能有一个核心部件,若未设置,窗口中心会为空。
通过 setCentralWidget() 方法设置(参数为任意 QWidget 派生类对象)。

3、模态和非模态对话框创建

3.1模态对话框:

使用QDialog::exec()方法显示
显示时会阻塞主线程,用户无法与父窗口交互
直到对话框关闭后,程序才能继续执行后续代码
适合需要用户必须做出选择才能继续的场景

3.2非模态对话框

使用QDialog::show()方法显示
显示时不会阻塞主线程,用户可以同时与对话框和父窗口交互
通常需要设置Qt::WA_DeleteOnClose属性,确保关闭时自动释放内存
适合提供辅助功能,不影响主窗口操作的场景

模态对话框创建示例

#include "mainwindow.h"
#include "ui_mainwindow.h"
#include "QDialog"
MainWindow::MainWindow(QWidget *parent):QMainWindow(parent),ui(new Ui::MainWindow)
{
ui->setupUi(this);
//点击新建按钮 弹出一个对话框
connect(ui->actionNew,&QAction::triggered,[=](){
// 对话框 分类
// 模态对话框与非模态对话框

// 模态对话框创建
QDialog dlg(this);
dlg.resize(200,100);
dlg.exec();



})
}
MainWindow::~MainWindow()
{
delete ui;
}

非模态对话框创建

#include "mainwindow.h"
#include "ui_mainwindow.h"
#include "QDialog"
MainWindow::MainWindow(QWidget *parent):QMainWindow(parent),ui(new Ui::MainWindow)
{
ui->setupUi(this);
//点击新建按钮 弹出一个对话框
connect(ui->actionNew,&QAction::triggered,[=](){
// 对话框 分类
// 模态对话框与非模态对话框

// 模态对话框创建
QDialog *dlg2 = new QDialog(this);
dlg2.resize(200,100);
dlg2.show();
dlg2->setAttribute(QT::Wa_DeleteonClose);


})
}
MainWindow::~MainWindow()
{
delete ui;
}
Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐