一、概述
QMainWindow继承自QWidget,并提供了一个预定义的布局,将窗口分成了菜单栏、工具栏、状态栏和中央部件区域。这些区域共同构成了一个功能丰富的主窗口,使得应用程序的开发更加简单和高效。
二、QMainWindow的常用组件及功能
-
菜单栏(QMenuBar)
- 位于主窗口顶部,主窗口标题栏下面。
- 一个主窗口最多只有一个菜单栏。
- 可以使用QMainWindow类的menubar()函数获取主窗口菜单栏指针,并添加菜单和菜单项。
- 菜单项是通过QAction类来抽象表示的,QAction类不仅可以用于菜单,还可以用于工具栏和快捷键等。
-
工具栏(QToolBar)
- 主窗口可以包含一个或多个工具栏,用于放置常用操作的快捷按钮。
- 使用addToolBar()方法将工具栏添加到主窗口。
- 工具栏中的按钮可以绑定特定的操作,方便用户进行快速操作。
- 工具栏是一个可移动的窗口,其停靠区域由QToolBar的allowAreas属性决定,包括左侧、右侧、顶部和底部等。
-
状态栏(QStatusBar)
- 位于主窗口底部,用于显示应用程序的状态信息。
- 使用statusBar()方法获取状态栏对象,并通过showMessage()方法显示文本消息。
- 状态栏中可以添加小部件,以显示更多的信息或控件。
-
中心部件(Central Widget)
- 中心部件区域是用来放置应用程序的主要内容的部分。
- 可以包含其他的QWidget或自定义的QWidget派生类。
- 使用setCentralWidget()方法将中心部件设置为特定的QWidget。
-
停靠部件(QDockWidget)
- 也称浮动窗口,可以有多个。
- 停靠部件可以在主窗口的边缘停靠,也可以浮动显示。
- 可以使用addDockWidget()方法将停靠部件添加到主窗口中,并设置其允许停靠的区域。
三、重要方法
- QMainWindow(QWidget *parent = nullptr):创建一个
QMainWindow
对象,可以指定父对象。 setCentralWidget(QWidget *widget):
设置主窗口的中央小部件。中央小部件是主窗口的主要内容区域。menuBar():
返回主窗口的菜单栏指针。addToolBar(Qt::ToolBarArea area, QToolBar *toolbar):
在指定区域添加工具栏。statusBar():
返回主窗口的状态栏指针。setWindowTitle(const QString &title):
设置窗口标题。setWindowIcon(const QIcon &icon):
设置窗口图标。setGeometry(int x, int y, int width, int height):
设置窗口的位置和大小。resize(int width, int height):
重新设置窗口大小。-
addDockWidget(Qt::DockWidgetArea area, QDockWidget *dockwidget):添加停靠窗口部件。
#include <QApplication>
#include <QMainWindow>
#include <QMenuBar>
#include <QToolBar>
#include <QStatusBar>
#include <QAction>
#include <QDockWidget>
#include <QTextEdit>
#include <QVBoxLayout>
#include <QLabel>
int main(int argc, char *argv[]) {
QApplication app(argc, argv);
QMainWindow mainWindow;
mainWindow.setWindowTitle("QMainWindow Example");
// 创建菜单栏和菜单
QMenuBar *menuBar = mainWindow.menuBar();
QMenu *fileMenu = menuBar->addMenu("File");
QAction *openAction = fileMenu->addAction("Open");
QAction *saveAction = fileMenu->addAction("Save");
// 创建工具栏
QToolBar *toolBar = mainWindow.addToolBar("Toolbar");
toolBar->addAction(openAction);
toolBar->addAction(saveAction);
// 创建状态栏
QStatusBar *statusBar = mainWindow.statusBar();
statusBar->showMessage("Ready");
// 创建中央部件
QWidget *centralWidget = new QWidget(&mainWindow);
QVBoxLayout *layout = new QVBoxLayout(centralWidget);
QLabel *label = new QLabel("Central Widget Content");
layout->addWidget(label);
mainWindow.setCentralWidget(centralWidget);
// 创建停靠部件
QDockWidget *dockWidget = new QDockWidget("Dock Window", &mainWindow);
dockWidget->setAllowedAreas(Qt::LeftDockWidgetArea | Qt::RightDockWidgetArea);
QLabel *dockLabel = new QLabel("Dock Window Content");
dockWidget->setWidget(dockLabel);
mainWindow.addDockWidget(Qt::LeftDockWidgetArea, dockWidget);
mainWindow.show();
return app.exec();
}
觉得有帮助的话,打赏一下呗。。