文章目录
QMainWindow Class
QMainWindow类提供了一个主应用程序窗口。
Header | #include < QMainWindow > |
---|---|
qmake | QT += widgets |
Inherits | QWidget |
Inherited By |
详细说明
Qt主窗口框架
主窗口为构建应用程序的用户界面提供了一个框架。Qt有QMainWindow及其相关的主窗口管理类。QMainWindow有自己的布局,您可以在其中添加QToolBars、QDockWidgets、QMenuBar和QStatusBar。布局有一个中心区域,可以被任何类型的小部件占据。您可以在下面看到布局的图像。
注意:不支持创建没有中心小部件的主窗口。即使只是一个占位符,也必须有一个中心小部件。
创建主窗口组件
中心小部件通常是标准的Qt小部件,如 QTextEdit 或 QGraphicsView。自定义小部件也可以用于高级应用程序。使用setCentralWidget() 设置中心小部件。
主窗口具有单个(SDI)或多个(MDI)文档界面。通过使用QMdiArea作为中心小部件,可以在Qt中创建MDI应用程序。
现在,我们将检查可以添加到主窗口的其他每个小部件。 我们举例说明如何创建和添加它们。
创建菜单
Qt在QMenu中实现菜单,QMainWindow将它们保存在QMenuBar中。QActions被添加到菜单中,菜单将它们显示为菜单项。
可以通过调用menuBar() 将新菜单添加到主窗口的菜单栏,该函数返回窗口的QMenuBar,然后使用QMenuBar::addMenu() 添加菜单。
QMainWindow附带了一个默认菜单栏,但是您也可以使用setMenuBar() 自己设置一个。如果希望实现自定义菜单栏(即不使用QMenuBar小部件),可以使用setMenuWidget() 进行设置。
创建工具栏
工具栏是在QToolBar类中实现的。使用addToolBar() 将工具栏添加到主窗口。
通过将工具栏指定给特定的 Qt::ToolBarArea ,可以控制工具栏的初始位置。您可以通过使用addToolBarBreak() 或insertToolBarBreak() 插入工具栏分隔符来分割区域—可以将此视为文本编辑中的换行符。还可以使用QToolBar::setAllowedAreas() 和QToolBar::setMovable() 限制用户的放置。
可以使用iconSize() 检索工具栏图标的大小。大小取决于平台;可以使用setIconSize() 设置固定大小。可以使用setToolButtonStyle() 更改工具栏中所有工具按钮的外观。
创建Dock小部件
Dock小部件在QDockWidget类中实现。dock小部件是一个可以停靠到主窗口中的窗口。您可以使用addDockWidget() 将停靠小部件添加到主窗口。
Qt::DockWidgetArea枚举提供了四个dock小部件区域:左、右、上和下。您可以指定哪个dock小部件区域应该占据与setCorner() 重叠的角落。默认情况下,每个区域只能包含一行(垂直或水平)dock小部件,但是如果使用setDockNestingEnabled() 启用嵌套,则可以在任意方向添加dock小部件。
两个dock小部件也可以堆叠在一起。然后使用QTabBar来选择应该显示哪些小部件。
状态栏
可以使用setStatusBar() 设置状态栏,但是在第一次调用statusBar() 时(返回主窗口的状态栏)会创建一个状态栏。有关如何使用它的信息,请参见QStatusBar。
存储状态
QMainWindow可以使用saveState() 存储其布局的状态;稍后可以使用restoreState() 检索它。它是存储的工具栏和停靠小部件的位置和大小(相对于主窗口的大小)。
公共类型
enum DockOption
flags DockOptions
此枚举包含指定QMainWindow的停靠行为的标志。
Constant | Value | Description |
---|---|---|
QMainWindow::AnimatedDocks | 0x01 | 与animated property相同。 |
QMainWindow::AllowNestedDocks | 0x02 | 与dockNestingEnabled属性相同。 |
QMainWindow::AllowTabbedDocks | 0x04 | 用户可以将一个dock小部件放在另一个小部件的“上面”。这两个小部件堆叠在一起,并出现一个选项卡栏,用于选择哪一个是可见的。 |
QMainWindow::ForceTabbedDocks | 0x08 | 每个dock区域都包含一堆选项卡式dock小部件。换句话说,dock widget不能在dock区域中相邻放置。如果设置了此选项,AllowNestedDocks将不起作用。 |
QMainWindow::VerticalTabs | 0x10 | 主窗口两侧的两个垂直停靠区域垂直显示它们的选项卡。如果未设置此选项,则所有停靠区域都会在底部显示其选项卡。表示AllowTabbedDock。另请参见setTabPosition() 。 |
QMainWindow::GroupedDragging | 0x20 | 当拖动dock的标题栏时,所有与之有选项卡的选项卡都将被拖动。表示AllowTabbedDock。如果某些QdockWidget在允许它们的区域中有限制,则无法正常工作。(此枚举值是在Qt5.6中添加的。) |
这些选项仅控制如何在QMainWindow窗口中放置dock小部件。它们不会重新排列dock小部件以符合指定的选项。因此,应该在将任何dock小部件添加到主窗口之前设置它们。例外情况是可以随时设置的AnimatedDocks和VerticalTabs选项。
属性
-
animated: bool 用于确定是否对dock小部件和工具栏进行动画操作
当停靠小部件或工具栏拖到主窗口上时,主窗口会调整其内容,以指示如果将停靠小部件或工具栏放下,它将停靠在何处。设置此属性将导致QMainWindow在平滑动画中移动其内容。清除此属性会使内容捕捉到新位置。
默认此属性为true。如果主窗口包含的小部件在调整大小或重新绘制自身时速度很慢,则可以清除此项。
设置此属性与使用setDockOptions() 设置AnimatedDocks选项相同。
- bool isAnimated() const
- void setAnimated(bool enabled)
setAnimated( true ) setAnimated( false ) -
dockNestingEnabled: bool 是否可以嵌套停靠
如果此属性为false,则停靠区域只能包含一行(水平或垂直)停靠小部件。如果此属性为true,则dock小部件占用的区域可以沿任意方向分割以包含更多dock小部件。
Dock嵌套仅在包含大量Dock小部件的应用程序中才是必需的。它给用户更大的自由来组织他们的主窗口。但是,当将dock小部件拖到主窗口上时,dock嵌套会导致更复杂(也不太直观)的行为,因为在dock区域中放置已放置的dock小部件的方式更多。
设置此属性与使用setDockOptions() 设置AllowNestedDocks选项相同。
- bool isDockNestingEnabled() const
- void setDockNestingEnabled(bool enabled)
-
dockOptions: DockOptions QMainWindow的停靠行为
默认值为 AnimatedDocks | AllowTabbedDocks。
- QMainWindow::DockOptions dockOptions() const
- void setDockOptions(QMainWindow::DockOptions options)
QMainWindow::VerticalTabs
-
documentMode: bool 将选项卡式dockwidgets的选项卡栏设置为文档模式
默认值为false。
- bool documentMode() const
- void setDocumentMode(bool enabled)
-
iconSize: QSize 此主窗口中工具栏图标的大小
默认值是GUI样式的默认工具栏图标大小。请注意,使用的图标必须至少具有此大小,因为图标仅按比例缩小。- QSize iconSize() const
- void setIconSize(const QSize &iconSize)
-
tabShape: QTabWidget::TabShape 用于选项卡式停靠小部件的选项卡形状
默认值为QTabWidget::Rounded。- QTabWidget::TabShape tabShape() const
- void setTabShape(QTabWidget::TabShape tabShape)
参考QTabWidget
-
toolButtonStyle: Qt::ToolButtonStyle 此主窗口中工具栏按钮的样式
要使toolbuttons的样式遵循系统设置,请将此属性设置为Qt::ToolButtonFollowStyle。在Unix上,将使用桌面环境中的用户设置。在其他平台上,Qt::ToolButtonFollowStyle仅表示图标。
默认值为Qt::toolbuttonOnly。- Qt::ToolButtonStyle toolButtonStyle() const
- void setToolButtonStyle(Qt::ToolButtonStyle toolButtonStyle)
参考Qt::ToolButtonStyle
-
unifiedTitleAndToolBarOnMac: bool 窗口是否使用macOS上的统一标题和工具栏外观
请注意,与Qt 4相比,Qt 5实现有几个限制:- 不支持在包含OpenGL内容的windows中使用。这包括QGLWidget和QOpenGLWidget。
- 使用可固定或可移动的工具栏可能会导致绘制错误,因此不建议使用
Access functions:
- bool unifiedTitleAndToolBarOnMac() const
- void setUnifiedTitleAndToolBarOnMac(bool set)
公共函数
构造和析构
- QMainWindow(QWidget *parent = nullptr, Qt::WindowFlags flags = Qt::WindowFlags())
- virtual ~QMainWindow()
属性相关
- bool isAnimated() const
void setAnimated(bool enabled) - bool isDockNestingEnabled() const
void setDockNestingEnabled(bool enabled) - QMainWindow::DockOptions dockOptions() const
void setDockOptions(QMainWindow::DockOptions options) - bool documentMode() const
void setDocumentMode(bool enabled) - QSize iconSize() const
void setIconSize(const QSize &iconSize) - QTabWidget::TabShape tabShape() const
void setTabShape(QTabWidget::TabShape tabShape) - Qt::ToolButtonStyle toolButtonStyle() const
void setToolButtonStyle(Qt::ToolButtonStyle toolButtonStyle) - bool unifiedTitleAndToolBarOnMac() const
void setUnifiedTitleAndToolBarOnMac(bool set)
停靠控件
-
void addDockWidget(Qt::DockWidgetArea area, QDockWidget *dockwidget)
-
void addDockWidget(Qt::DockWidgetArea area, QDockWidget *dockwidget, Qt::Orientation orientation)
-
void removeDockWidget(QDockWidget *dockwidget)
-
Qt::DockWidgetArea dockWidgetArea(QDockWidget *dockwidget) const
-
void splitDockWidget(QDockWidget *first, QDockWidget *second, Qt::Orientation orientation)
将first小部件覆盖的空间分成两部分,将first小部件移动到第1部分,并将second停靠小部件移动到第2部分。
方向指定空间的划分方式:Qt::Horizontal 将第2个dock小部件放置在第1个的右侧;Qt::Vertical 将第2个dock小部件放置在第1个的下方。
注意: 如果 first 当前在一个选项卡区域中,那么second 将被添加为一个新选项卡,而不是第一个的邻居。这是因为单个选项卡只能包含一个dock小部件。
注意: Qt::LayoutDirection影响分割区域的两部分中dock小部件的顺序。当从右到左的布局方向被启用时,dock小部件的放置将被反转。
-
void tabifyDockWidget(QDockWidget *first, QDockWidget *second)
将 second 停靠小部件移动到 first 停靠小部件的顶部,在主窗口中创建一个选项卡式停靠区域
QList<QDockWidget *> tabifiedDockWidgets(QDockWidget *dockwidget) const
返回与dockwidget一起在选项卡的dock小部件
-
void resizeDocks(const QList<QDockWidget *> &docks, const QList< int > &sizes, Qt::Orientation orientation)
-
bool restoreDockWidget(QDockWidget *dockwidget)
-
Qt::DockWidgetArea corner(Qt::Corner corner) const
void setCorner(Qt::Corner corner, Qt::DockWidgetArea area) -
QTabWidget::TabPosition tabPosition(Qt::DockWidgetArea area) const
void setTabPosition(Qt::DockWidgetAreas areas, QTabWidget::TabPosition tabPosition)
工具条
- void addToolBar(Qt::ToolBarArea area, QToolBar *toolbar)
- void addToolBar(QToolBar *toolbar)
- QToolBar * addToolBar(const QString &title)
- void insertToolBar(QToolBar *before, QToolBar *toolbar)
- void removeToolBar(QToolBar *toolbar)
- Qt::ToolBarArea toolBarArea(QToolBar *toolbar) const
- void addToolBarBreak(Qt::ToolBarArea area = Qt::TopToolBarArea)
- void insertToolBarBreak(QToolBar *before)
- void removeToolBarBreak(QToolBar *before)
- bool toolBarBreak(QToolBar *toolbar) const
中央控件
- QWidget * centralWidget() const
- void setCentralWidget(QWidget *widget)
- QWidget * takeCentralWidget()
菜单栏和状态栏
- virtual QMenu * createPopupMenu()
- QMenuBar * menuBar() const
void setMenuBar(QMenuBar *menuBar) - QWidget * menuWidget() const
void setMenuWidget(QWidget *menuBar) - QStatusBar * statusBar() const
void setStatusBar(QStatusBar *statusbar)
状态的保存和恢复
- bool restoreState(const QByteArray &state, int version = 0)
- QByteArray saveState(int version = 0) const
演示代码
#include <QtWidgets>
void setMenuTool(QMainWindow *mw){
QCommonStyle cs;
QIcon icon = cs.standardIcon ((QStyle::StandardPixmap)0);
QAction *newAct = new QAction(icon,"&New", mw);
newAct->setShortcuts(QKeySequence::New);
newAct->setStatusTip("Create a new file");
icon = cs.standardIcon ((QStyle::StandardPixmap)33);
QAction *openAct = new QAction(icon,"&Open...", mw);
openAct->setShortcuts(QKeySequence::Open);
openAct->setStatusTip("Open an existing file");
QMenu *fileMenu = mw->menuBar()->addMenu("&File");
fileMenu->addAction(newAct);
fileMenu->addSeparator();
fileMenu->addAction(openAct);
QToolBar *fileToolBar = mw->addToolBar("File");
fileToolBar->addAction(newAct);
fileToolBar->addSeparator ();
fileToolBar->addAction(openAct);
}
void setDock( QMainWindow *mw ){
for (int i = 0,j=1; i < 10; ++i,j*=2) {
QString str = QString("Dock %1").arg (i);
QDockWidget *dock = new QDockWidget(str, mw);
dock->setMinimumWidth (120);
dock->setAllowedAreas (Qt::AllDockWidgetAreas);
mw->addDockWidget((Qt::DockWidgetArea)(1), dock);
QLabel *label = new QLabel(str,dock);
label->setStyleSheet ("background:cyan");
dock->setWidget (label);
}
}
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
a.setApplicationName ("QMainWindow");
QMainWindow w;
setMenuTool(&w);
setDock (&w);
// auto *central = new QDockWidget(&w);
// w.setCentralWidget (central);
w.setDockNestingEnabled (true);
w.statusBar ()->showMessage ("QMainWindow");
w.resize (350,200);
w.show();
return a.exec();
}
参考
- Application Example,
- Dock Widgets Example,
- MDI Example,
- SDI Example,
- Menus Example.