Qt - QMainWindow
1. 描述
QMainWindow(QWidget的子类)
- 主窗口类
- 可以包含菜单栏,工具栏,状态栏
- 不可以内嵌到其他窗口的内部,不过假如你去了标题栏并且指定了父对象那也是可以内嵌到其他窗口内部的。
-
Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget) { ui->setupUi(this); this->setStyleSheet("background-color: rgb(150,150,150)"); MainWindowSon* m = new MainWindowSon(this); m->setWindowFlags(Qt::Widget | Qt::FramelessWindowHint);//去掉标题栏 m->setStyleSheet("background-color: rgb(30,150,250)"); m->show(); }
QMainWindow 类提供了一个主应用程序窗口。
主窗口为构建应用程序的用户界面提供了一个框架。Qt 有 QMainWindow 及其相关的主窗口管理类。QMainWindow 有自己的布局,可以在其中添加 QToolBar(可添加多个)、QDockWidget(可添加多个)、QMenuBar 和 QStatusBar。布局有一个中心区域,可以被任何类型的小部件占据。如下图:
注意:不支持创建没有中央小部件的主窗口。即使只是一个占位符,也必须有一个中央小部件。
2. 类型成员
1、enum QMainWindow::DockOption:此枚举包含指定 QMainWindow 的停靠行为的标志。
- AnimatedDocks:与 animated 属性相同。
- AllowNestedDocks:与 dockNestingEnabled 属性相同。
- AllowTabbedDocks:用户可以将一个停靠小部件放在另一个停靠小部件的“顶部”。这两个小部件堆叠在一起,并出现一个选项卡栏,用于选择哪个是可见的。
- ForceTabbedDocks:每个停靠区都包含一个标签式停靠小部件堆栈。即停靠小部件不能在停靠区域中彼此相邻放置。如果设置了此选项,则 AllowNestedDocks 无效。
- VerticalTabs:主窗口两侧的两个垂直停靠区垂直显示它们的选项卡。如果未设置此选项,则所有停靠区域都在底部显示其选项卡。
- GroupedDragging:当拖动停靠栏的标题栏时,所有与它一起标记的选项卡都将被拖动。如果某些 QDockWidgets 在允许的区域中有限制,则无法正常工作。
这些选项仅控制如何将停靠小部件拖放到 QMainWindow 中。 它们不会重新排列停靠小部件以符合指定的选项。出于这个原因,应该在将任何停靠小部件添加到主窗口之前设置它们。 AnimatedDocks 和 VerticalTabs 选项除外,它们可以随时设置。
3. 属性成员
1、animated : bool
停靠小部件和工具栏是否动画。
当一个停靠小部件或工具栏被拖到主窗口上时,主窗口会调整其内容以指示停靠小部件或工具栏将停靠在哪里。
设置此属性会使 QMainWindow 以平滑的动画移动其内容。
默认为 true。如果主窗口包含在调整大小或重新绘制自身时很慢的小部件,则可能会被设为 false。
设置此属性与使用 setDockOptions() 设置 AnimatedDocks 选项相同。
2、dockNestingEnabled : bool
是否可以嵌套停靠小部件。
如果此属性为 false,则停靠区域只能包含单行(水平或垂直)停靠小部件。 如果此属性为 true,则停靠小部件占用的区域可以在任一方向上拆分以包含更多停靠小部件。
设置此属性与使用 setDockOptions() 设置 AllowNestedDocks 选项相同。
3、dockOptions : DockOptions
停靠选项,默认值为 AnimatedDocks | AllowTabbedDocks。
4、documentMode : bool
选项卡式停靠小部件的选项卡栏是否设置为文档模式。默认为 false。
5、iconSize : QSize
工具栏图标的大小。默认为 GUI 样式的默认工具栏图标大小。使用的图标必须至少具有此大小,因为图标仅按比例缩小。
6、tabShape : QTabWidget::TabShape
用于选项卡式停靠小部件的选项卡形状。默认为 QTabWidget::Rounded。
QTabWidget::Rounded:选项卡以圆形外观绘制。
QTabWidget::Triangular:选项卡以三角形外观绘制。
7、toolButtonStyle : Qt::ToolButtonStyle
主窗口中工具栏按钮的样式。
要使工具按钮的样式遵循系统设置,则设置为 Qt::ToolButtonFollowStyle。在 Unix 上,将使用来自桌面环境的用户设置。在其他平台上,Qt::ToolButtonFollowStyle 仅表示图标。
默认值为 Qt::ToolButtonIconOnly。
enum Qt::ToolButtonStyle:工具按钮的样式,描述按钮的文本和图标应如何显示。
- Qt::ToolButtonIconOnly:只显示图标。
- Qt::ToolButtonTextOnly:只显示文本。
- Qt::ToolButtonTextBesideIcon:文本出现在图标旁边。
- Qt::ToolButtonTextUnderIcon:文本出现在图标下方。
- Qt::ToolButtonFollowStyle:跟随样式。
8、unifiedTitleAndToolBarOnMac : bool
窗口是否使用 macOS 上统一的标题和工具栏外观。
4. 成员函数
1、【信号】void iconSizeChanged(const QSize &iconSize)
当窗口中使用的图标大小发生变化时,会发出此信号。参数为新的图标大小。
2、【信号】void tabifiedDockWidgetActivated(QDockWidget *dockWidget)
当通过选择选项卡激活选项卡式停靠小部件时会发出此信号。
3、【信号】void toolButtonStyleChanged(Qt::ToolButtonStyle toolButtonStyle)
当窗口中用于工具按钮的样式发生更改时,将发出此信号。
4、void addDockWidget(Qt::DockWidgetArea area, QDockWidget *dockwidget)
将给定的停靠小部件添加到指定区域。
enum Qt::DockWidgetArea:
- Qt::LeftDockWidgetArea
- Qt::RightDockWidgetArea
- Qt::TopDockWidgetArea
- Qt::BottomDockWidgetArea
- Qt::AllDockWidgetAreas
- Qt::NoDockWidgetArea
void addDockWidget(Qt::DockWidgetArea area, QDockWidget *dockwidget, Qt::Orientation orientation)
以方向指定的方向将停靠小部件添加到给定区域。
void removeDockWidget(QDockWidget *dockwidget)
从主窗口布局中移除停靠小部件并将其隐藏。停靠小部件不会被 delete。
5、void addToolBar(Qt::ToolBarArea area, QToolBar *toolbar)
将工具栏添加到此主窗口中的指定区域。
enum Qt::ToolBarArea:
- Qt::LeftToolBarArea
- Qt::RightToolBarArea
- Qt::TopToolBarArea
- Qt::BottomToolBarArea
- Qt::AllToolBarAreas
- Qt::NoToolBarArea
void addToolBar(QToolBar *toolbar)
相当于调用 addToolBar(Qt::TopToolBarArea, toolbar)。
QToolBar * addToolBar(const QString &title)
创建一个 QToolBar 对象,将其窗口标题设置为 title,并将其插入顶部工具栏区域。
6、void addToolBarBreak(Qt::ToolBarArea area = Qt::TopToolBarArea)
使 area 的工具栏在界面上另起一行显示(添加中断)。
7、void setCentralWidget(QWidget *widget) / QWidget * centralWidget()
设置主窗口的中心小部件。QMainWindow 拥有小部件的所有权并在适当的时候将其删除。
QWidget * takeCentralWidget()
从主窗口中删除中央小部件。被移除的小部件的所有权被传递给调用者。
8、void setCorner(Qt::Corner corner, Qt::DockWidgetArea area)
Qt::DockWidgetArea corner(Qt::Cornercorner)
将给定的停靠小部件区域设置为占据指定的角落。
- Qt::TopLeftCorner
- Qt::TopRightCorner
- Qt::BottomLeftCorner
- Qt::BottomRightCorner
9、【virtual】QMenu *createPopupMenu()
返回一个弹出菜单,其中包含主窗口中工具栏和停靠小部件的可选中(checkable)条目。如果不存在工具栏和停靠小部件,则此函数返回 nullptr。
默认情况下,当用户激活上下文菜单(通常通过右键单击工具栏或停靠小部件)时,主窗口会调用此函数。
如果要创建自定义弹出菜单,应重新实现此函数并返回新创建的弹出菜单。弹出菜单的所有权转移给调用者。
10、Qt::DockWidgetArea dockWidgetArea(QDockWidget *dockwidget)
返回 dockwidget 的 Qt::DockWidgetArea。如果dockwidget还没有被添加到主窗口,这个函数返回Qt::NoDockWidgetArea。
11、void insertToolBar(QToolBar *before, QToolBar *toolbar)
将工具栏 toolbar 插入到工具栏 before 所占据的区域中,使其出现在 before 之前。
void insertToolBarBreak(QToolBar *before)
在 before 指定的工具栏之前插入一个工具栏中断(换行显示)。
void removeToolBar(QToolBar *toolbar)
从主窗口布局中移除工具栏并将其隐藏。工具栏不会被 delete。
void removeToolBarBreak(QToolBar *before)
删除之前在之前指定的工具栏之前插入的工具栏中断。
Qt::ToolBarArea toolBarArea(const QToolBar *toolbar)
返回工具栏的 Qt::ToolBarArea。如果工具栏没有被添加到主窗口,则返回 Qt::NoToolBarArea。
bool toolBarBreak(QToolBar *toolbar)
返回 toolbar 之前是否有工具栏中断。
12、QMenuBar *menuBar() / void setMenuBar(QMenuBar *menuBar)
返回主窗口的菜单栏。 如果菜单栏不存在,此函数创建并返回一个空菜单栏。
如果想让一个Mac应用程序中的所有窗口共享一个菜单栏,不要使用这个函数来创建它,因为这里创建的菜单栏会让 QMainWindow 作为它的父级。必须创建一个没有父级的菜单栏,然后可以在所有 Mac 窗口之间共享该菜单栏:
QMenuBar *menuBar = new QMenuBar(nullptr);
void setMenuWidget(QWidget *menuBar) / QWidget * menuWidget()
将主窗口的菜单栏设置为 menuBar。
QMainWindow 取得 menuBar 指针的所有权,并在适当的时候将其删除。
13、void resizeDocks(const QList<QDockWidget *> &docks, const QList<int> &sizes, Qt::Orientation orientation)
将 docks 列表中的停靠小部件的大小调整为 sizes 列表中的相应大小(以像素为单位)。
如果方向是 Qt::Horizontal,则调整宽度,否则调整停靠小部件的高度。
不会调整 QMainWindow 本身的大小。任何额外/缺失的空间都根据尺寸的相对权重分布在小部件之间。
resizeDocks({blueWidget, yellowWidget}, {20 , 40}, Qt::Horizontal);
14、bool restoreDockWidget(QDockWidget *dockwidget)
如果在调用 restoreState() 后创建了 dockwidget,则恢复它的状态。返回状态是否已恢复。
15、QByteArray saveState(int version = 0)
保存此主窗口的工具栏和停靠小部件的当前状态。这包括可以使用 setCorner() 设置的角落设置。 版本号作为数据的一部分存储。
objectName 属性用于标识每个 QToolBar 和 QDockWidget。应该确保此属性对于添加到 QMainWindow 的每个 QToolBar 和 QDockWidget 都是唯一的。
要恢复保存的状态,请将返回值和版本号传递给 restoreState()。
要在窗口关闭时保存几何图形,可以实现如下关闭事件:
void MyMainWindow::closeEvent(QCloseEvent *event)
{
QSettings settings("MyCompany", "MyApp");
settings.setValue("geometry", saveGeometry());
settings.setValue("windowState", saveState());
QMainWindow::closeEvent(event);
}
bool restoreState(const QByteArray &state, int version = 0)
恢复此主窗口的工具栏和停靠小部件的状态。也恢复角落设置。
版本号与存储在状态中的版本号进行比较。如果它们不匹配,则主窗口的状态保持不变且返回 false;否则状态将恢复且返回 true。
要恢复使用 QSettings 保存的几何图形,可以使用如下代码:
void MainWindow::readSettings()
{
QSettings settings("MyCompany", "MyApp");
restoreGeometry(settings.value("myWidget/geometry").toByteArray());
restoreState(settings.value("myWidget/windowState").toByteArray());
}
16、void setStatusBar(QStatusBar *statusbar) / QStatusBar * statusBar()
设置状态栏。将状态栏设置为 nullptr 会将其从主窗口中删除。QMainWindow 拥有状态栏指针的所有权并在适当的时候将其删除。
17、void setTabPosition(Qt::DockWidgetAreas areas, QTabWidget::TabPosition tabPosition)
QTabWidget::TabPosition tabPosition(Qt::DockWidgetArea area)
将给定停靠小部件区域的选项卡位置设置为指定的 tabPosition。默认情况下,所有停靠区域都在底部显示它们的选项卡。
注意:VerticalTabs 停靠选项会覆盖此方法设置的选项卡位置。
18、void splitDockWidget(QDockWidget *first, QDockWidget *second, Qt::Orientation orientation)
将第一个停靠小部件覆盖的空间分成两部分,将第一个停靠小部件移动到第一部分,并将第二个停靠小部件移动到第二部分。
方向指定空间的划分方式:Qt::Horizontal 拆分将第二个停靠小部件放置在第一个的右侧; Qt::Vertical 拆分将第二个停靠小部件放置在第一个下方。
注意:如果 first 当前位于选项卡式停靠区域中,则 second 将作为新选项卡添加,而不是作为 first 的邻居。这是因为单个选项卡只能包含一个停靠小部件。
19、QList<QDockWidget *> tabifiedDockWidgets(QDockWidget *dockwidget)
返回与 dockwidget 一起标记的停靠小部件。
20、void tabifyDockWidget(QDockWidget *first, QDockWidget *second)
将停靠小部件 second 移动到停靠小部件 first 的顶部,在主窗口中创建一个选项卡式停靠区域。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· SQL Server 2025 AI相关能力初探
· 单线程的Redis速度为什么快?
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码