QT学习笔记(三)
在 Qt 中,QMainWindow 是一个提供标准应用程序窗口框架的类,它内置了菜单栏(Menu Bar)、工具栏(Tool Bar)、状态栏(Status Bar)等组件,方便开发者快速构建具有标准结构的桌面应用。
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;
}
更多推荐

所有评论(0)