主窗口(02):【类】QMainWindow [官翻]

QMainWindow Class

QMainWindow类提供了一个主应用程序窗口。

Header#include < QMainWindow >
qmakeQT += widgets
InheritsQWidget
Inherited By

详细说明

Qt主窗口框架

主窗口为构建应用程序的用户界面提供了一个框架。Qt有QMainWindow及其相关的主窗口管理类。QMainWindow有自己的布局,您可以在其中添加QToolBars、QDockWidgets、QMenuBar和QStatusBar。布局有一个中心区域,可以被任何类型的小部件占据。您可以在下面看到布局的图像。

img

注意:不支持创建没有中心小部件的主窗口。即使只是一个占位符,也必须有一个中心小部件。

创建主窗口组件

中心小部件通常是标准的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的停靠行为的标志。

ConstantValueDescription
QMainWindow::AnimatedDocks0x01与animated property相同。
QMainWindow::AllowNestedDocks0x02与dockNestingEnabled属性相同。
QMainWindow::AllowTabbedDocks0x04用户可以将一个dock小部件放在另一个小部件的“上面”。这两个小部件堆叠在一起,并出现一个选项卡栏,用于选择哪一个是可见的。
QMainWindow::ForceTabbedDocks0x08每个dock区域都包含一堆选项卡式dock小部件。换句话说,dock widget不能在dock区域中相邻放置。如果设置了此选项,AllowNestedDocks将不起作用。
QMainWindow::VerticalTabs0x10主窗口两侧的两个垂直停靠区域垂直显示它们的选项卡。如果未设置此选项,则所有停靠区域都会在底部显示其选项卡。表示AllowTabbedDock。另请参见setTabPosition() 。
QMainWindow::GroupedDragging0x20当拖动dock的标题栏时,所有与之有选项卡的选项卡都将被拖动。表示AllowTabbedDock。如果某些QdockWidget在允许它们的区域中有限制,则无法正常工作。(此枚举值是在Qt5.6中添加的。)

这些选项仅控制如何在QMainWindow窗口中放置dock小部件。它们不会重新排列dock小部件以符合指定的选项。因此,应该在将任何dock小部件添加到主窗口之前设置它们。例外情况是可以随时设置的AnimatedDocks和VerticalTabs选项。

属性

  1. animated: bool 用于确定是否对dock小部件和工具栏进行动画操作

    当停靠小部件或工具栏拖到主窗口上时,主窗口会调整其内容,以指示如果将停靠小部件或工具栏放下,它将停靠在何处。设置此属性将导致QMainWindow在平滑动画中移动其内容。清除此属性会使内容捕捉到新位置。

    默认此属性为true。如果主窗口包含的小部件在调整大小或重新绘制自身时速度很慢,则可以清除此项。

    设置此属性与使用setDockOptions() 设置AnimatedDocks选项相同。

    • bool isAnimated() const
    • void setAnimated(bool enabled)
    setAnimated( true )setAnimated( false )
  2. dockNestingEnabled: bool 是否可以嵌套停靠

    如果此属性为false,则停靠区域只能包含一行(水平或垂直)停靠小部件。如果此属性为true,则dock小部件占用的区域可以沿任意方向分割以包含更多dock小部件。

    Dock嵌套仅在包含大量Dock小部件的应用程序中才是必需的。它给用户更大的自由来组织他们的主窗口。但是,当将dock小部件拖到主窗口上时,dock嵌套会导致更复杂(也不太直观)的行为,因为在dock区域中放置已放置的dock小部件的方式更多。

    设置此属性与使用setDockOptions() 设置AllowNestedDocks选项相同

    • bool isDockNestingEnabled() const
    • void setDockNestingEnabled(bool enabled)

  3. dockOptions: DockOptions QMainWindow的停靠行为

    默认值为 AnimatedDocks | AllowTabbedDocks。

    • QMainWindow::DockOptions dockOptions() const
    • void setDockOptions(QMainWindow::DockOptions options)

    QMainWindow::VerticalTabs

  4. documentMode: bool 将选项卡式dockwidgets的选项卡栏设置为文档模式

    默认值为false。

    • bool documentMode() const
    • void setDocumentMode(bool enabled)
  5. iconSize: QSize 此主窗口中工具栏图标的大小
    默认值是GUI样式的默认工具栏图标大小。请注意,使用的图标必须至少具有此大小,因为图标仅按比例缩小。

    • QSize iconSize() const
    • void setIconSize(const QSize &iconSize)
  6. tabShape: QTabWidget::TabShape 用于选项卡式停靠小部件的选项卡形状
    默认值为QTabWidget::Rounded。

    • QTabWidget::TabShape tabShape() const
    • void setTabShape(QTabWidget::TabShape tabShape)

    参考QTabWidget

  7. toolButtonStyle: Qt::ToolButtonStyle 此主窗口中工具栏按钮的样式
    要使toolbuttons的样式遵循系统设置,请将此属性设置为Qt::ToolButtonFollowStyle。在Unix上,将使用桌面环境中的用户设置。在其他平台上,Qt::ToolButtonFollowStyle仅表示图标。
    默认值为Qt::toolbuttonOnly。

    • Qt::ToolButtonStyle toolButtonStyle() const
    • void setToolButtonStyle(Qt::ToolButtonStyle toolButtonStyle)

    参考Qt::ToolButtonStyle

  8. 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.
  • 1
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值