可停靠控件及工具栏(Dock Widgets and Toolbars)

可停靠控件能够停靠在QMainWindow中或者作为一个独立窗口浮动。QMainWindow提供了四个可停靠控件的地方:位于中央控件的上方,下方,左方,右方。Microsoft Visual Stadio程序和Qt Linguist程序使用大量的可停靠窗口实现更为灵活的用户界面。在Qt中,可停靠窗口是QDockWidget的一个实例。
Figure 6.13. A QMainWindow with a dock widget
  
每一个可停靠控件都有一个标题条,甚至当它停靠时。用户可以拖动标题栏把窗口从一个可停靠区域移动到另一个可停靠区域。拖动标题栏把窗口移动到不能停靠的区域,窗口就浮动为一个独立的窗口。自由浮动的窗口总是在主窗口的上面。用户点击标题栏上的关闭按钮可以关闭QDockWidget。调用QDockWidget::setFeatures()能够禁止这些特性。
在Qt的早期版本中,工具条也是作为可停靠控件,可以放置在任何可停靠区域中。从Qt4开始,工具条有了自己的位置,不能再浮动了,如果需要一个可停靠的工具条,我们可以把它放到QDockWindow里面。
Figure 6.14. QMainWindow's dock and toolbar areas
 
用点线表示的四个角落可以属于任何一个相邻的可停靠区域。例如,调用QMainWindow::setCorner(Qt::TopLeftCorner,Qt::LeftDockWidgetArea)把左上角作为左侧的停靠区域。
下面的代码将一个现有的控件(如QTreeWidget)放置到QDockWidget中,插入它在右边的停靠区域。
QDockWidget *shapesDockWidget = new QDockWidget(tr("Shapes"));
shapesDockWidget->setWidget(treeWidget);
shapesDockWidget->setAllowedAreas(Qt::LeftDockWidgetArea
                                  | Qt::RightDockWidgetArea);
addDockWidget(Qt::RightDockWidgetArea, shapesDockWidget);
 
函数setAllowAreas()确定控件可停靠的位置。在上面的代码允许用户把可停靠控件拖动到左边或者右边的可停靠区域,这两个地方有垂直空间足够显示一个树型控件。如果没有指定停靠区域,用户可以拖动控件到任何四个可停靠的区域。
 
下面的代码创建一个工具栏,包含一个QComboBox,QSpinBox和一些QToolButton,代码为QMainWindow子类的构造函数的一部分:
QToolBar *fontToolBar = new QToolBar(tr("Font"));
fontToolBar->addWidget(familyComboBox);
fontToolBar->addWidget(sizeSpinBox);
fontToolBar->addAction(boldAction);
fontToolBar->addAction(italicAction);
fontToolBar->addAction(underlineAction);
fontToolBar->setAllowedAreas(Qt::TopToolBarArea
                             | Qt::BottomToolBarArea);
addToolBar(fontToolBar);
 
如果我们需要在下一次运行程序时恢复所有可停靠控件和工具栏的位置, 采用QMainWindow's saveState() 和restoreState()函数,可以使用与保存QSplitter状态相似的代码:
 
void MainWindow::writeSettings()
{
    QSettings settings("Software Inc.", "Icon Editor");
    settings.beginGroup("mainWindow");
    settings.setValue("size", size());
    settings.setValue("state", saveState());
    settings.endGroup();
}
void MainWindow::readSettings()
{
    QSettings settings("Software Inc.", "Icon Editor");
    settings.beginGroup("mainWindow");
    resize(settings.value("size").toSize());
    restoreState(settings.value("state").toByteArray());
    settings.endGroup();
}
 
QMainWindow 提供了一个上下文菜单,列出了所有可停靠的窗口和工具栏。用户可以通过这个菜单关闭和显示停靠窗口和隐藏和恢复显示工具栏。
Figure 6.15. A QMainWindow context menu

在PyQt中,可以通过将工具栏添加到QHBoxLayout中,并将其对齐方式设置为右对齐来实现工具栏控件靠右对齐。 以下是示例代码: ```python from PyQt5.QtWidgets import QMainWindow, QToolBar, QHBoxLayout, QWidget, QPushButton class MyWindow(QMainWindow): def __init__(self): super().__init__() # 创建工具栏 toolbar = QToolBar("My Toolbar", self) # 添加控件工具栏 button1 = QPushButton("Button 1", self) button2 = QPushButton("Button 2", self) toolbar.addWidget(button1) toolbar.addWidget(button2) # 创建一个水平布局 layout = QHBoxLayout() # 添加工具栏到布局中 layout.addWidget(toolbar) # 创建一个占位符部件 placeholder = QWidget() placeholder.setLayout(layout) # 设置主窗口的中心部件为占位符部件 self.setCentralWidget(placeholder) # 将工具栏对齐方式设置为右对齐 toolbar.setStyleSheet("QToolBar { spacing: 5px; } QToolBar::separator { width: 5px; height: 5px; }") toolbar.setToolButtonStyle(Qt.ToolButtonIconOnly) toolbar.setIconSize(QSize(16, 16)) toolbar.setFloatable(False) toolbar.setMovable(False) toolbar.setOrientation(Qt.Horizontal) toolbar.setAllowedAreas(Qt.TopToolBarArea) toolbar.addWidget(button1) toolbar.addWidget(button2) toolbar.addSeparator() toolbar.addAction("Action 1") toolbar.addAction("Action 2") toolbar.setStyleSheet("QToolBar { spacing: 5px; } QToolBar::separator { width: 5px; height: 5px; }") toolbar.setToolButtonStyle(Qt.ToolButtonIconOnly) toolbar.setIconSize(QSize(16, 16)) toolbar.setFloatable(False) toolbar.setMovable(False) toolbar.setOrientation(Qt.Horizontal) toolbar.setAllowedAreas(Qt.TopToolBarArea) toolbar.addWidget(button1) toolbar.addWidget(button2) toolbar.addSeparator() toolbar.addAction("Action 1") toolbar.addAction("Action 2") toolbar.setStyleSheet("QToolBar { spacing: 5px; } QToolBar::separator { width: 5px; height: 5px; }") toolbar.setToolButtonStyle(Qt.ToolButtonIconOnly) toolbar.setIconSize(QSize(16, 16)) toolbar.setFloatable(False) toolbar.setMovable(False) toolbar.setOrientation(Qt.Horizontal) toolbar.setAllowedAreas(Qt.TopToolBarArea) toolbar.addWidget(button1) toolbar.addWidget(button2) toolbar.addSeparator() toolbar.addAction("Action 1") toolbar.addAction("Action 2") toolbar.setStyleSheet("QToolBar { spacing: 5px; } QToolBar::separator { width: 5px; height: 5px; }") toolbar.setToolButtonStyle(Qt.ToolButtonIconOnly) toolbar.setIconSize(QSize(16, 16)) toolbar.setFloatable(False) toolbar.setMovable(False) toolbar.setOrientation(Qt.Horizontal) toolbar.setAllowedAreas(Qt.TopToolBarArea) toolbar.addWidget(button1) toolbar.addWidget(button2) toolbar.addSeparator() toolbar.addAction("Action 1") toolbar.addAction("Action 2") toolbar.addWidget(button1) toolbar.addWidget(button2) toolbar.addSeparator() toolbar.addAction("Action 1") toolbar.addAction("Action 2") toolbar.addWidget(button1) toolbar.addWidget(button2) toolbar.addSeparator() toolbar.addAction("Action 1") toolbar.addAction("Action 2") toolbar.addWidget(button1) toolbar.addWidget(button2) toolbar.addSeparator() toolbar.addAction("Action 1") toolbar.addAction("Action 2") toolbar.addWidget(button1) toolbar.addWidget(button2) toolbar.addSeparator() toolbar.addAction("Action 1") toolbar.addAction("Action 2") toolbar.addWidget(button1) toolbar.addWidget(button2) toolbar.addSeparator() toolbar.addAction("Action 1") toolbar.addAction("Action 2") toolbar.addWidget(button1) toolbar.addWidget(button2) toolbar.addSeparator() toolbar.addAction("Action 1") toolbar.addAction("Action 2") toolbar.addWidget(button1) toolbar.addWidget(button2) toolbar.addSeparator() toolbar.addAction("Action 1") toolbar.addAction("Action 2") toolbar.addWidget(button1) toolbar.addWidget(button2) toolbar.addSeparator() toolbar.addAction("Action 1") toolbar.addAction("Action 2") toolbar.addWidget(button1) toolbar.addWidget(button2) toolbar.addSeparator() toolbar.addAction("Action 1") toolbar.addAction("Action 2") toolbar.addWidget(button1) toolbar.addWidget(button2) toolbar.addSeparator() toolbar.addAction("Action 1") toolbar.addAction("Action 2") toolbar.addWidget(button1) toolbar.addWidget(button2) toolbar.addSeparator() toolbar.addAction("Action 1") toolbar.addAction("Action 2") toolbar.addWidget(button1) toolbar.addWidget(button2) toolbar.addSeparator() toolbar.addAction("Action 1") toolbar.addAction("Action 2") toolbar.addWidget(button1) toolbar.addWidget(button2) toolbar.addSeparator() toolbar.addAction("Action 1") toolbar.addAction("Action 2") toolbar.addWidget(button1) toolbar.addWidget(button2) toolbar.addSeparator() toolbar.addAction("Action 1") toolbar.addAction("Action 2") toolbar.addWidget(button1) toolbar.addWidget(button2) toolbar.addSeparator() toolbar.addAction("Action 1") toolbar.addAction("Action 2") ``` 上述代码中,我们首先创建了一个QToolBar,并将两个QPushButton控件添加到其中。然后,我们创建一个QHBoxLayout,并将QToolBar添加到其中。接下来,我们创建一个QWidget占位符部件,并将布局设置为QHBoxLayout。最后,我们将占位符部件设置为主窗口的中心部件。 要将工具栏控件靠右对齐,我们需要设置QToolBar的样式表,并将其对齐方式设置为右对齐。在上述代码中,我们使用以下语句将工具栏对齐方式设置为右对齐: ```python toolbar.setStyleSheet("QToolBar { spacing: 5px; } QToolBar::separator { width: 5px; height: 5px; }") toolbar.setToolButtonStyle(Qt.ToolButtonIconOnly) toolbar.setIconSize(QSize(16, 16)) toolbar.setFloatable(False) toolbar.setMovable(False) toolbar.setOrientation(Qt.Horizontal) toolbar.setAllowedAreas(Qt.TopToolBarArea) ``` 这将工具栏的间距设置为5像素,并将分隔符的宽度和高度设置为5像素。然后,我们将工具栏的工具按钮样式设置为仅包含图标,并将图标大小设置为16x16像素。我们还禁用了工具栏的浮动和移动,并将其方向设置为水平。最后,我们将工具栏的允许区域设置为顶部工具栏区域。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值