就目前的应用程序而言,一般包含菜单栏、工具栏、状态栏、中央区域等。
qt窗口部件类图如下:
一个主窗口提供了一个构建应用程序用户界面的框架。
Qt有QMainWindow及其相关类来管理主窗口。
QMainWindow有自己的布局,可以向其中添加QToolBars、QDockWidgets、QMenuBar和QStatusBar。布局有一个中心区域,可以被任何类型的小部件占用。
可以看到以下布局的图像。
菜单栏(QMenu)是一个包含下拉菜单的列表,由QAction
动作类实现。
Qt在QMenu中实现菜单,而QMainWindow将它们保留在QMenuBar中。将QActions添加到菜单中,它们会显示为菜单项。
可以通过调用menuBar()来向主窗口的菜单栏添加新菜单,该函数返回窗口的QMenuBar,然后使用QMenuBar::addMenu()添加菜单。
QMainWindow带有默认的菜单栏,但也可以使用setMenuBar()自己设置一个菜单栏。如果希望实现自定义菜单栏(即不使用QMenuBar小部件),则可以使用setMenuWidget()进行设置。
以下是创建菜单的示例:
void MainWindow::createMenus()
{
fileMenu = menuBar()->addMenu(tr("&File"));
fileMenu->addAction(newAct);
fileMenu->addAction(openAct);
fileMenu->addAction(saveAct);
}
createPopupMenu()函数在主窗口接收上下文菜单事件时创建弹出菜单。默认实现会生成一个包含停靠窗口和工具栏的可选操作的菜单。可以为自定义菜单重新实现createPopupMenu()。
可以在设计师直接输入菜单
可以在动作区添加动作,可以添加图标,动作可以复用,在菜单栏和工具栏添加。
工具栏在QToolBar类中实现。可以使用addToolBar()将工具栏添加到主窗口中。
通过将工具栏分配到特定的Qt::ToolBarArea,可以控制工具栏的初始位置。可以通过使用addToolBarBreak()或insertToolBarBreak()插入工具栏断点来分割一个区域,类似于文本编辑中的换行符。还可以使用QToolBar::setAllowedAreas()和QToolBar::setMovable()限制用户在何处放置工具栏。
可以使用iconSize()检索工具栏图标的大小。这些大小取决于平台;可以使用setIconSize()设置固定大小。可以使用setToolButtonStyle()更改工具栏中所有工具按钮的外观。
以下是创建工具栏的示例:
void MainWindow::createToolBars()
{
fileToolBar = addToolBar(tr("File"));
fileToolBar->addAction(newAct);
}
可以使用setStatusBar()设置状态栏,但是第一次调用statusBar()(返回主窗口的状态栏)时会自动创建一个状态栏。
ui->statusBar->showMessage("helloworld");
一个主窗口可以放置一个中心部件。使用setCentralWidget(QWidget *widget)
方法设置。
setCentralWidget(new QTextEdit);
Dock widgets是使用QDockWidget类实现的。dock widget是一个可以停靠在主窗口的窗口。可以使用addDockWidget()将dock widget添加到主窗口中。
根据Qt :: DockWidgetArea枚举,有四个dock widget区域:左、右、上和下。可以使用setCorner()指定应占用区域重叠处角落的dock widget区域。默认情况下,每个区域只能包含一个dock widget行(垂直或水平),但如果使用setDockNestingEnabled()启用嵌套,则dock widget可以沿任一方向添加。
两个dock widget也可能堆叠在一起。然后使用QTabBar选择应显示哪个窗口部件。
下面是一个创建和添加dock widget到主窗口的示例代码:
QDockWidget *dockWidget = new QDockWidget(tr("Dock Widget"), this);
dockWidget->setAllowedAreas(Qt::LeftDockWidgetArea | Qt::RightDockWidgetArea);
dockWidget->setWidget(dockWidgetContents);
addDockWidget(Qt::LeftDockWidgetArea, dockWidget);
QMenu* pM = new QMenu();
pM->addAction(new QAction("123", this));
pM->addAction(new QAction("123", this));
QToolButton* pT = new QToolButton;
pT->setMenu(pM);
pT->setPopupMode(QToolButton::MenuButtonPopup);
ui->mainToolBar->addWidget(pT);
ui->statusBar->addPermanentWidget(new QLabel("helloworld"));
通过QWidgetAction
类可以创建自定义菜单。
QWidgetAction类通过接口扩展了QAction,用于将自定义小部件插入到基于操作的容器(例如工具栏)中。
应用程序中的大多数操作都表示为菜单中的项目或工具栏中的按钮。但是,有时需要更复杂的小部件。例如,文字处理器中的缩放操作可以使用QToolBar中的QComboBox实现,以呈现不同缩放级别的范围。QToolBar提供了QToolBar :: insertWidget()作为方便函数,用于插入单个小部件。但是,如果想要实现使用自定义小部件在多个容器中进行可视化的操作,则必须子类化QWidgetAction。
例如,如果在将QWidgetAction添加到QToolBar中,则将调用QWidgetAction :: createWidget()
。该函数的重新实现应该使用指定的父项创建一个新的自定义小部件。
如果从容器小部件中删除操作,则调用QWidgetAction :: deleteWidget(),并将先前创建的自定义小部件作为参数。默认实现隐藏小部件,并使用QObject :: deleteLater()将其删除。
如果只有一个单独的自定义小部件,则可以使用setDefaultWidget()设置为默认小部件。
如果将操作添加到QToolBar中,或者通常将其添加到支持QWidgetAction的操作容器中,则将使用该部件。
如果在同一时间将只有默认小部件的QWidgetAction添加到两个工具栏中,则默认小部件仅显示在添加操作的第一个工具栏中。
QWidgetAction接管了默认小部件的所有权。
请注意,激活操作取决于小部件,例如通过重新实现鼠标事件处理程序并调用QAction :: trigger()
来激活操作。
QWidget* MyAction::createWidget(QWidget *parent)
{
QWidget* pW = new QWidget(parent);
QLabel* pLabel = new QLabel("哈哈");
QLineEdit* pLE = new QLineEdit();
QHBoxLayout* pHB = new QHBoxLayout();
pHB->addWidget(pLabel);
pHB->addWidget(pLE);
pW->setLayout(pHB);
return pW;
}