【学习笔记】QT从入门到实战完整版(菜单栏、工具栏、浮动窗口、状态栏、中心部件)(3)
QMainWindow
QMainWindow 是一个为用户提供主窗口程序的类,包含以下几种类型部件,是许多应用程序的基础。
示例代码
void MainWindow::test()
{
// ----------------------------------- 菜单栏(只能有一个)-----------------------------------
QMenuBar *menuBar = this->menuBar();
this->setMenuBar(menuBar); // 将菜单栏设置到窗口中 这里是 set 开头表示只能有一个
// 增加菜单
QMenu *fileMenu = menuBar->addMenu("文件");
QMenu *editMenu = menuBar->addMenu("编辑");
// 增加子菜单
QAction *fileMenuAction = fileMenu->addAction("新建");
QAction *openMenuAction = fileMenu->addAction("打开");
fileMenu->addSeparator(); // 增加分隔线
QAction *closeMenuAction = fileMenu->addAction("关闭");
QAction *printMenuAction = fileMenu->addAction("打印");
// 为每个子菜单设置信号槽
connect(fileMenuAction, &QAction::triggered, []{
qDebug() << "点击了菜单栏: 新建";
});
connect(openMenuAction, &QAction::triggered, []{
qDebug() << "点击了菜单栏: 打开";
});
connect(closeMenuAction, &QAction::triggered, []{
qDebug() << "点击了菜单栏: 关闭";
});
connect(printMenuAction, &QAction::triggered, []{
qDebug() << "点击了菜单栏: 打印";
});
// ----------------------------------- 增加工具栏(可以有多个)-----------------------------------
QToolBar *toolBar = new QToolBar("工具栏", this);
this->addToolBar(Qt::RightToolBarArea, toolBar); // 将工具栏加入到窗口中, 并设置默认向左停靠, 这里是 add 开头表示可以有多个
toolBar->setAllowedAreas(Qt::LeftToolBarArea | Qt::RightToolBarArea); // 只允许左右停靠
toolBar->setFloatable(false); // 禁止浮动
//toolBar->setMovable(false); // 禁止移动(总开关, 不允许停靠\不允许浮动\不允许拖拽)
// 可以增加已有的菜单
toolBar->addAction(fileMenuAction); // 选择菜单栏里面的 ‘新建’ 菜单 (不能再定义 QAction * 来接收返回值)
toolBar->addAction(openMenuAction); // 选择菜单栏里面的 ‘编辑’ 菜单 (不能再定义 QAction * 来接收返回值)
toolBar->addSeparator();
// 也可以新增自定义的菜单
QAction *selToolAction = toolBar->addAction("选择");
QAction *fselToolAction = toolBar->addAction("反选");
toolBar->addSeparator(); // 增加分隔线
// 也可以增加控件
QPushButton *btn = new QPushButton("按钮", this);
toolBar->addWidget(btn);
// 为每个子菜单设置信号槽
connect(selToolAction, &QAction::triggered, []{
qDebug() << "点击了工具栏: 选择";
});
connect(fselToolAction, &QAction::triggered, []{
qDebug() << "点击了工具栏: 反选";
});
connect(btn, &QPushButton::clicked, []{
qDebug() << "点击了工具栏: 按钮";
});
// ----------------------------------- 状态栏(只能有一个) -----------------------------------
QStatusBar *stBar = statusBar();
this->setStatusBar(stBar); // 将状态栏设置到窗口中 这里是 set 开头表示只能有一个
QLabel *labelTs = new QLabel("提示消息", this);
QLabel *labelSt = new QLabel("状态信息", this);
stBar->addWidget(labelTs); // 增加标签
stBar->addPermanentWidget(labelSt); // 在右边增加标签
// ----------------------------------- 中心部件(只能有一个)-----------------------------------
QTextEdit *textEdit = new QTextEdit(this);
this->setCentralWidget(textEdit); // 将中心部件设置到窗口中 这里是 set 开头表示只能有一个
// ----------------------------------- 浮动窗口(可以有多个)-----------------------------------
QDockWidget *dockWidget = new QDockWidget("浮动窗口", this);
this->addDockWidget(Qt::BottomDockWidgetArea, dockWidget); // 将浮动窗口加入到窗口中, 并设置默认向底停靠, 这里是 add 开头表示可以有多个
dockWidget->setAllowedAreas(Qt::BottomDockWidgetArea | Qt::TopDockWidgetArea); // 设置只能向顶部或底部停靠
}
实现效果

触发效果
点击了菜单栏: 新建
点击了菜单栏: 打开
点击了菜单栏: 关闭
点击了菜单栏: 打印
点击了菜单栏: 新建
点击了菜单栏: 打开
点击了工具栏: 选择
点击了工具栏: 反选
点击了工具栏: 按钮
不得不吐槽
想把 QT 打包成单文件可执行程序,没想到居然会有那么大,想想也释然。主要是 QT 程序依赖的库太多了,而微软的 MFC 因为很多依赖库系统自带,所以不需要连依赖库都打包。



浙公网安备 33010602011771号