Qt 主窗口全家桶:菜单栏、工具栏、状态栏与对话框完全指南

一、菜单栏

  • Qt 中的菜单栏是通过QMenuBar 这个类来实现的。
  • 一个主窗口最多只有一个菜单栏。
  • 位于主窗口顶部、主窗口标题栏下面。
  • 菜单栏中包含菜单.菜单中包含菜单项。

1、创建菜单栏

  • 代码示例:
  1. 方法一:用函数menuBar()创建菜单栏

    cpp 复制代码
        //创建菜单栏
        QMenuBar* menubar=menuBar();
        //将创建好的菜单栏放入窗口中
        this->setMenuBar(menubar);
  2. 方法二:在堆上动态创建菜单栏

    cpp 复制代码
        QMenuBar* menubar=new QMenuBar(this);
        this->setMenuBar(menubar);

2、在菜单栏中添加菜单

  • 代码示例:
  1. 通过addMenu来添加菜单

    cpp 复制代码
        //创建菜单
        QMenu* menu1=new QMenu("文件");
        QMenu* menu2=new QMenu("编辑");
        QMenu* menu3=new QMenu("视图");
    
        //将菜单添加进菜单栏中
        menubar->addMenu(menu1);
        menubar->addMenu(menu2);
        menubar->addMenu(menu3);

3、创建菜单项

  • 代码示例:
  1. 用QAction来创建菜单项
cpp 复制代码
    //创建菜单项
    QAction* action1=new QAction("打开");
    QAction* action2=new QAction("保存");
    QAction* action3=new QAction("关闭");

    //将菜单项添加到菜单中
    menu1->addAction(action1);
    menu1->addAction(action2);
    menu1->addAction(action3);

4、在菜单栏之间添加分割线

  • 代码示例
  1. 用addSeparator()来实现添加分割线
cpp 复制代码
    //将菜单项添加到菜单中
    menu1->addAction(action1);
    menu1->addSeparator();//添加分割线
    menu1->addAction(action2);
    menu1->addSeparator();//添加分割线
    menu1->addAction(action3);

5、综合运用

  • 创建菜单和中央控件
cpp 复制代码
MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
    , ui(new Ui::MainWindow)
{
    ui->setupUi(this);
    
    //设置窗口标题
    this->setWindowTitle("记事本");
    
    //创建菜单栏
    QMenuBar* menubar=new QMenuBar(this);
    //将创建好的菜单栏放入窗口中 
    this->setMenuBar(menubar);

    //创建菜单
    QMenu* menu1=new QMenu("文件");
    QMenu* menu2=new QMenu("编辑");
    QMenu* menu3=new QMenu("视图");

    //将菜单添加进菜单栏中
    menubar->addMenu(menu1);
    menubar->addMenu(menu2);
    menubar->addMenu(menu3);

    //创建菜单项
    QAction* action1=new QAction("打开");
    QAction* action2=new QAction("保存");
    QAction* action3=new QAction("关闭");

    //将菜单项添加到菜单中
    menu1->addAction(action1);
    menu1->addSeparator();//添加分割线
    menu1->addAction(action2);
    menu1->addSeparator();//添加分割线
    menu1->addAction(action3);
    
    //创建一个中央控件
    QTextEdit* edit=new QTextEdit(this);
    this->setCentralWidget(edit);
    edit->setPlaceholderText("此处编写⽂本内容...");
    
}
  • 给菜单项添加动作
cpp 复制代码
    //连接信号槽
    connect(action1,&QAction::triggered,this,&MainWindow::load);
    connect(action2,&QAction::triggered,this,&MainWindow::save);
    connect(action3,&QAction::triggered,this,&MainWindow::close);
cpp 复制代码
void MainWindow::load()
{
    // 选择文件
    QString fileName = QFileDialog::getOpenFileName(
        this,
        "加载文件",
        QStandardPaths::writableLocation(QStandardPaths::HomeLocation),
        "文本文件 (*.txt);;所有文件 (*.*)"
        );

    // 用户取消
    if (fileName.isEmpty()) {
        qDebug() << "用户取消选择";
        return;
    }

    // 打开文件
    QFile file(fileName);
    if (!file.open(QIODevice::ReadOnly | QIODevice::Text)) {
        qDebug() << "文件打开失败:" << file.errorString();
        return;
    }

    // 读取内容
    QTextStream in(&file);
    in.setEncoding(QStringConverter::Utf8); // 自动处理 UTF-8

    QString text = in.readAll();
    file.close();

    // 显示到界面
    edit->setPlainText(text);
}

void MainWindow::save()
{
    // 弹出对话框, 选择写入文件的路径
    QFileDialog* dialog = new QFileDialog (this);
    QString fileName = dialog->getSaveFileName (this , "保存文件 ", "C:/Users/1/");
    qDebug() << "fileName: " << fileName;

    // 写入文件
    std::ofstream file(fileName.toStdString().c_str());
    if (!file.is_open()) {
        qDebug() << "文件保存失败!";
        return;
    }
    const QString& text = edit->toPlainText ();
    file << text.toStdString();
    file.close ();
}

二、工具栏

  • 工具栏是菜单项的一种快捷方式。
  • 可以有多个也可以没有。
  • 一般以图片的形式存在。

1、创建工具栏

  • 调用QMainWindow类的addToolBar()函数来创建工具栏
cpp 复制代码
    //创建工具栏
    QToolBar* toolbar=new QToolBar(this);
    this->addToolBar(toolbar);

    //将工具添加到工具栏
    toolbar->addAction(action1);
    toolbar->addAction(action2);

    //设置图标
    QIcon icon1("://open.png");
    QIcon icon2("://save.png");

    action1->setIcon(icon1);
    action2->setIcon(icon2);

2、设置停靠位置

枚举值 含义
Qt::LeftToolBarArea 停靠在左侧
Qt::RightToolBarArea 停靠在右侧
Qt::TopToolBarArea 停靠在顶部
Qt::BottomToolBarArea 停靠在底部
Qt::AllToolBarAreas 以上四个位置均可停靠
  • 方法一:创建工具栏的同时指定其停靠的位置。
cpp 复制代码
    //创建工具栏
    QToolBar* toolbar=new QToolBar(this);
    //设置工具栏在顶部显示
    this->addToolBar(Qt::TopToolBarArea,toolbar);
  • 方法二:使用QToolBar类提供的setAllowedAreas()函数设置停靠位置。
cpp 复制代码
    //创建工具栏
    QToolBar* toolbar=new QToolBar(this);
    this->addToolBar(toolbar);
    //只允许右边停靠
    toolbar->setAllowedAreas(Qt::RightToolBarArea);

3、设置浮动属性

  • 工具栏的浮动属性可以通过QToolBar类提供的setFloatable() 函数来设置。
cpp 复制代码
    //设置可以悬浮
    toolbar->setFloatable(true);

4、设置移动属性

  • 设置工具栏的移动属性可以通过QToolBar类提供的setMovable() 函数来设置。
cpp 复制代码
    //设置不能移动
    toolbar->setMovable(false);

5、综合运用

  • 可以移动
  • 任意位置停靠
  • 可以悬停
cpp 复制代码
    //创建工具栏
    QToolBar* toolbar=new QToolBar(this);
    this->addToolBar(toolbar);
    //只允许右边停靠
    toolbar->setAllowedAreas(Qt::AllToolBarAreas);

    //设置可以悬浮
    toolbar->setFloatable(true);

    //设置不能移动
    toolbar->setMovable(true);

    //将工具添加到工具栏
    toolbar->addAction(action1);
    toolbar->addAction(action2);

    //设置图标
    QIcon icon1("://open.png");
    QIcon icon2("://save.png");

    action1->setIcon(icon1);
    action2->setIcon(icon2);

三、状态栏

  • 状态栏是应⽤程序中输出简要信息的区域。
  • ⼀般位于主窗口的最底部。
  • ⼀个窗口中最多只能有⼀个状态栏。
  • 在Qt中状态栏是通过QStatusBar类来实现的。

1、状态栏的创建

  • 通过QMainWindow提供的**statusBar()**创建状态栏。
cpp 复制代码
    //创建状态栏
    QStatusBar* stbar=statusBar();
    //将状态栏设置到窗口
    setStatusBar(stbar);

2、实时信息

  • 通过**showMessage()**函数来设置一个实时信息。
  • 可以控制显示多少秒之后消失。
cpp 复制代码
    //设置实时信息
    stbar->showMessage("运行正常",2000);

3、永久信息

  • 通过label来建立一个永久信息。
  • 利用**addPermanentWidget()**可以将标签设置到状态栏右边。
cpp 复制代码
    //建立标签
    QLabel* label1=new QLabel("左侧永久信息",this);
    QLabel* label2=new QLabel("右侧永久信息",this);

    //信息显示
    stbar->addWidget(label1);
    //右侧信息显示
    stbar->addPermanentWidget(label2);

四、浮动窗口

  • 浮动窗⼝是通过 QDockWidget类 来实现浮动的功能。

1、浮动窗口的创建

  • 浮动窗⼝的创建是通过QDockWidget类提供的构造⽅法**QDockWidget()**函数动态创建的
cpp 复制代码
    //创建窗口
    QDockWidget* dockwidget=new QDockWidget("浮动窗口",this);
    addDockWidget(Qt::AllDockWidgetAreas,dockwidget);

2、设置停靠位置

枚举值 含义
Qt::LeftDockWidgetArea 停靠在主窗口左侧
Qt::RightDockWidgetArea 停靠在主窗口右侧
Qt::TopDockWidgetArea 停靠在主窗口顶部
Qt::BottomDockWidgetArea 停靠在主窗口底部
Qt::AllDockWidgetAreas 允许在上述所有区域停靠
  • 浮动窗⼝是位于中⼼部件的周围。
  • 可以通过QDockWidget类中提供**setAllowedAreas()**函数设置其允许停靠的位置。
cpp 复制代码
    //设置窗口只允许上下停靠
    dockwidget->setAllowedAreas(Qt::TopDockWidgetArea | Qt::BottomDockWidgetArea);

五、对话框

对话框是 GUI 程序中不可或缺的组成部分。一些不适合在主窗口实现的功能组件可以设置在对话框中。对话框通常是一个顶层窗口,出现在程序最上层,用于实现短期任务或者简洁的用户交互。Qt 常用的内置对话框有:

类名 作用 最常用静态函数
QFileDialog 选择文件或文件夹 getOpenFileName()getSaveFileName()getExistingDirectory()
QColorDialog 选择颜色 getColor()
QFontDialog 选择字体 getFont()
QInputDialog 获取简单用户输入 getText()getInt()getDouble()getItem()
QMessageBox 提示、警告、确认 information()warning()critical()question()

1、对话框的分类

类型 说明 使用方式
**模态对话框(Modal)**​ 阻塞其他窗口,必须关闭才能继续 exec()
**非模态对话框(Modeless)**​ 不阻塞,可与主窗口同时操作 show()
**半模态(Application Modal)**​ 阻塞整个应用,而非单个窗口 setWindowModality()
1️⃣ 模态对话框(Modal Dialog)

定义 :对话框弹出后,阻塞同一应用程序中其他窗口的用户交互,直到该对话框被关闭。

特点

  • 强制用户先处理对话框
  • 防止用户在未完成当前任务时操作其他部分
  • 通常用于需要用户确认或提供必要信息的场景
cpp 复制代码
    //当点击 "新建" 时,弹出⼀个模态对话框
    connect(action4,&QAction::triggered,[=](){
        QDialog dlog(this);
        dlog.resize(200,100);
        dlog.exec();
    });
2️⃣ 非模态对话框(Modeless Dialog)

定义:对话框弹出后,阻塞同一应用程序中其他窗口的用户交互,直到该对话框被关闭。

特点

  • 强制用户先处理对话框
  • 防止用户在未完成当前任务时操作其他部分
  • 通常用于需要用户确认或提供必要信息的场景
cpp 复制代码
    //当点击 "新建" 时,弹出⼀个非模态对话框
    connect(action4,&QAction::triggered,[=](){
        QDialog* dlog=new QDialog(this);
        dlog->resize(200,100);//设置窗口大小
        dlog->setAttribute(Qt::WA_DeleteOnClose);//当窗口关闭时自动释放dlog
        dlog->show();
    });
3️⃣ 半模态对话框(Semi-Modal)

定义 :介于模态和非模态之间,通过 setWindowModality()控制阻塞范围。

Qt::WindowModality 说明
Qt::NonModal 非模态,不阻塞任何窗口
Qt::WindowModal 阻塞其父窗口及所有子窗口
Qt::ApplicationModal 阻塞整个应用程序
cpp 复制代码
    //当点击 "新建" 时,弹出⼀个半模态对话框
    connect(action4,&QAction::triggered,[=](){
        QDialog* dialog = new QDialog(this);
        dialog->setAttribute(Qt::WA_DeleteOnClose);
        
        // Qt::WindowModal 表示:只阻塞父窗口及其子窗口,不阻塞其他顶级窗口
        dialog->setWindowModality(Qt::WindowModal); 
        
        dialog->resize(200, 100);
        dialog->show(); // 继续使用 show(),因为它是非阻塞的
    });

2、内置对话框

对话框 类名 核心用途
文件对话框 QFileDialog 打开/保存文件、选择文件夹
颜色对话框 QColorDialog 选取颜色
字体对话框 QFontDialog 选取字体样式
输入对话框 QInputDialog 获取文本、数字、列表项
消息框 QMessageBox 提示、警告、错误、确认
1️⃣ QFileDialog(文件对话框)
  • 最常用的对话框,用于文件系统交互。
cpp 复制代码
    //文件对话框
    QPushButton* btn=new QPushButton("文件对话框",this);
    btn->move(300,400);
    connect(btn,&QPushButton::clicked,[=](){
        QString fileName = QFileDialog::getOpenFileName(
            this,
            "选择文件",
            QDir::homePath(),                 // 默认路径
            "Images (*.png *.jpg);;Text (*.txt);;All (*.*)" // 过滤器
            );
    });
2️⃣ QColorDialog(颜色对话框)
  • 用于选取 RGB、HSV 或 CMYK 颜色。
cpp 复制代码
    //颜色对话框
    QPushButton* btn=new QPushButton("颜色对话框",this);
    btn->move(300,400);
    connect(btn,&QPushButton::clicked,[=](){
        QColor color = QColorDialog::getColor(
            Qt::red,        // 初始颜色
            this,
            "选择颜色",
            QColorDialog::ShowAlphaChannel // 选项:显示透明度
            );

        if (color.isValid()) {
            // 用户选择了有效颜色
        }
    });
3️⃣ QFontDialog(字体对话框)
  • 用于选择字体族、大小和样式。
cpp 复制代码
    //字体对话框
    QPushButton* btn=new QPushButton("字体对话框",this);
    btn->move(300,400);
    connect(btn,&QPushButton::clicked,[=](){
        bool ok;
        QFont font = QFontDialog::getFont(
            &ok,           // 返回用户是否点击了 OK
            QFont("Arial", 12), // 初始字体
            this,
            "选择字体"
            );
        if (ok) {
            // 用户确认了字体
        }
    });
4️⃣ QInputDialog(输入对话框)
  • 轻量级对话框,用于获取简单输入。
cpp 复制代码
    //输入对话框
    QPushButton* btn=new QPushButton("输入对话框",this);
    btn->move(300,400);
    connect(btn,&QPushButton::clicked,[=](){
        bool ok;
        QString text = QInputDialog::getText(
            this, "输入", "用户名:",
            QLineEdit::Normal, "默认文本", &ok
            );
    });
5️⃣ QMessageBox(消息对话框)
  • 用于向用户显示信息或请求确认。
cpp 复制代码
    //消息对话框
    QPushButton* btn=new QPushButton("消息对话框",this);
    btn->move(300,400);
    connect(btn,&QPushButton::clicked,[=](){
        // 信息提示
        QMessageBox::information(this, "提示", "操作成功!");

        // 警告
        QMessageBox::warning(this, "警告", "磁盘空间不足");

        // 错误
        QMessageBox::critical(this, "错误", "文件无法打开");

        // 询问(带返回值判断)
        int ret = QMessageBox::question(
            this,
            "确认",
            "确定要删除吗?",
            QMessageBox::Yes | QMessageBox::No,
            QMessageBox::No
            );

        if (ret == QMessageBox::Yes) {
            // 执行删除
        }
    });
相关推荐
XMYX-03 小时前
28 - Go JSON 数据操作
开发语言·golang·json
三*一3 小时前
Mapbox GL JS 自研面要素整形工具开发实录
开发语言·javascript·arcgis·ecmascript
超级小星星4 小时前
C 语言结构体内存对齐深度解析:从概念到实战
c语言·开发语言
狮子座明仔4 小时前
AgentSPEX:当 Agent 框架开始把“控制流“从 Python 里抠出来
开发语言·python
笨笨饿4 小时前
74_SysTick滴答定时器中断
c语言·开发语言·人工智能·单片机·嵌入式硬件·算法·学习方法
BatyTao5 小时前
QT Creator快速创建主项目-子项目
qt
科芯创展5 小时前
XZ4058B/C,20V,外置MOS,8.4V/8.7V开关充电芯片 宽范围电源电压:8.9V~20V-(电池充电电压:8.4V/8.7V)
c语言·开发语言
AI玫瑰助手5 小时前
Python流程控制:break与continue语句的区别与应用
开发语言·python·信息可视化