原创作者:郑同学的笔记
原创地址:https://zhengjunxue.blog.csdn.net/article/details/137113081
qq技术交流群:921273910
- 在Qt中,QMainWindow 是一个用于创建应用程序主窗口的重要类。它提供了一种基本的应用程序框架,包括菜单栏、工具栏、状态栏以及可停靠的窗口部件等功能。通过继承 QMainWindow 类,可以方便地创建自定义的主窗口,并添加各种用户界面元素。
一、简介
QMainWindow是标准基础窗口中结构最复杂的窗口, 其组成如下:
- 提供了菜单栏, 工具栏, 状态栏, 停靠窗口
- 菜单栏: 只能有一个, 位于窗口的最上方
- 工具栏: 可以有多个, 默认提供了一个, 窗口的上下左右都可以停靠
- 状态栏: 只能有一个, 位于窗口最下方
- 停靠窗口: 可以有多个, 默认没有提供, 窗口的上下左右都可以停靠
二、相关函数
1、菜单栏
菜单栏是主窗口顶部的一组菜单项,通常用于提供应用程序的主要功能入口。使用 menuBar() 函数可以获取菜单栏的指针,并通过 addMenu() 函数添加菜单。
通过代码的方式添加菜单或者菜单项
// 给菜单栏添加菜单
QAction *QMenuBar::addMenu(QMenu *menu);
QMenu *QMenuBar::addMenu(const QString &title);
QMenu *QMenuBar::addMenu(const QIcon &icon, const QString &title);
// 给菜单对象添加菜单项(QAction)
QAction *QMenu::addAction(const QString &text);
QAction *QMenu::addAction(const QIcon &icon, const QString &text);
// 添加分割线
QAction *QMenu::addSeparator();
菜单项 QAction 事件的处理
单击菜单项, 该对象会发出一个信号
// 点击QAction对象发出该信号
[signal] void QAction::triggered(bool checked = false);
2、工具栏
工具栏通常位于主窗口的顶部或侧边,提供了一组常用工具按钮,便于用户快速访问常用功能。使用 addToolBar() 函数可以添加工具栏,并向其中添加按钮。
不通过UI界面直接操作,那么就需要调用相关的API函数了
// 在QMainWindow窗口中添加工具栏
void QMainWindow::addToolBar(Qt::ToolBarArea area, QToolBar *toolbar);
void QMainWindow::addToolBar(QToolBar *toolbar);
QToolBar *QMainWindow::addToolBar(const QString &title);
// 将Qt控件放到工具栏中
// 工具栏类: QToolBar
// 添加的对象只要是QWidget或者启子类都可以被添加
QAction *QToolBar::addWidget(QWidget *widget);
// 添加QAction对象
QAction *QToolBar::addAction(const QString &text);
QAction *QToolBar::addAction(const QIcon &icon, const QString &text);
// 添加分隔线
QAction *QToolBar::addSeparator()
3、 状态栏
状态栏位于主窗口底部,用于显示应用程序的状态信息或其他提示。使用 statusBar() 函数可以获取状态栏的指针,然后通过设置文本内容来更新状态栏的显示信息。
一般情况下, 需要在状态栏中添加某些控件, 显示某些属性, 使用最多的就是添加标签 QLabel
// 类型: QStatusBar
void QStatusBar::addWidget(QWidget *widget, int stretch = 0);
[slot] void QStatusBar::clearMessage();
[slot] void QStatusBar::showMessage(const QString &message, int timeout = 0);
4、停靠窗口
停靠窗口是可以随主窗口一起移动和调整大小的窗口,通常用于显示辅助信息或工具。使用 addDockWidget() 函数可以将停靠窗口添加到主窗口的指定位置,同时使用 setCentralWidget() 函数可以设置主窗口的中心部件,通常是用户界面的主要内容。
停靠窗口可以通过鼠标拖动停靠到窗口的上、下、左、右,或者浮动在窗口上方。如果需要这种类型的窗口必须手动添加,如果在非QMainWindow类型的窗口中添加了停靠窗口, 那么这个窗口是不能移动和浮动的。
三、demo
cpp
#include <QtWidgets>
class MyMainWindow : public QMainWindow
{
Q_OBJECT
public:
MyMainWindow()
{
// 标题
setWindowTitle("Qt Demo");
// 菜单栏
QMenuBar *menuBar = new QMenuBar(this);
setMenuBar(menuBar);
QMenu *fileMenu = menuBar->addMenu("File");
QAction *newAction = fileMenu->addAction("New");
connect(newAction, &QAction::triggered, this, &MyMainWindow::onNew);
QMenu *editMenu = menuBar->addMenu("Edit");
editMenu->addAction("Cut");
editMenu->addAction("Copy");
editMenu->addAction("Paste");
QMenu *viewMenu = menuBar->addMenu("View");
viewMenu->addAction("Zoom In");
viewMenu->addAction("Zoom Out");
// 工具栏
QToolBar *toolBar1 = addToolBar("Tool1");
QAction *action1 = toolBar1->addAction("Action1");
connect(action1, &QAction::triggered, this, &MyMainWindow::onAction1);
QToolBar *toolBar2 = addToolBar("Tool2");
toolBar2->addAction("Action3");
toolBar2->addAction("Action4");
QToolBar *toolBar3 = addToolBar("Tool3");
toolBar3->addAction("Action5");
toolBar3->addAction("Action6");
// 状态栏
QStatusBar *statusBar = new QStatusBar(this);
setStatusBar(statusBar);
statusBar->showMessage("Ready");
// 核心窗口
QTextEdit *centralWidget = new QTextEdit(this);
setCentralWidget(centralWidget);
// 停靠窗口
QDockWidget *dockWidget = new QDockWidget("Dock", this);
dockWidget->setAllowedAreas(Qt::LeftDockWidgetArea | Qt::RightDockWidgetArea);
QTextEdit *dockContent = new QTextEdit(dockWidget);
dockWidget->setWidget(dockContent);
addDockWidget(Qt::RightDockWidgetArea, dockWidget);
}
public slots:
void onNew()
{
QMessageBox::information(this, "New Action", "New action triggered!");
}
void onAction1()
{
QMessageBox::information(this, "Action1", "Action1 triggered!");
}
};
int main(int argc, char *argv[])
{
QApplication app(argc, argv);
MyMainWindow mainWindow;
mainWindow.show();
return app.exec();
}
#include "main.moc"
运行结果如下图所示
参考
1.爱编程的大丙——Qt 教程