参考:
QT系统学习系列:1.2 ToolBar(工具栏)qt toolbar-CSDN博客
https://blog.csdn.net/Fdog/article/details/113333449
C++ GUI Programming with Qt 4, Second Edition
本地环境:
win10专业版,64位,Qt5.12
ToolBar属性介绍
movable
指示toolBar是否可以移动,默认是true。比如可以把toolBar移动为竖向,如下图所示。
代码使用isMovable()和setMovable()访问和设置。
allowedAreas
指工具栏可以移动的范围。如果选择NoToolBarArea,表示可以放在任何地方。
代码使用allowedAreas()和setAllowedAreas()访问和设置。
Orientation
指工具栏的方向,默认是水平的。如果该工具栏是QMainWindow管理时,不应该修改(实际改了效果也不变)。
代码使用orientation()和setOrientation()访问和设置。
如果想把已添加到主窗口中的工具栏移动到另一个ToolBarArea,应该使用QMainWindow::addToolBar()
或者QMainWindow::insertToolBar()
toolButtonStyle
约定了icon和text的显示方式。
含义与字面意义相同。其中,beside是icon在左,文字在右;follow是根据QStyle::StyleHint格式显示的。
StyleHint
是一个用于指示样式的特定提示信息的枚举类型。它提供了一些预定义的提示信息,可用于在绘制或布局UI组件时影响样式的行为。
常用值包括:
-
SH_ToolButton_Underline:指示工具按钮是否显示下划线来标识键盘快捷键。
-
SH_ItemView_ArrowKeysNavigateIntoChildren:指示是否使用方向键导航进入子项。
-
SH_TabBar_Alignment:指示 TabBar 中选项卡的对齐方式。
StyleHint可以通过QStyle类的styleHint方法来访问和设置。例如
QStyleOptionButton option;
bool underline = style()->styleHint(QStyle::SH_ToolButton_Underline, &option);
floatable
指是否可以将工具栏作为独立窗口进行拖放,默认是true。代码使用isFloatable()和setFloatable()访问和设置。
实例效果
实现
首先在设计页面,新增一个toolbar。这里我起名叫serviceToolBar。
下面开始给工具栏做布局。
首先,如果在mainwindow上新建两个toolBar,那么即使将两个的方向都设置为vertical,第二个也会是水平的(我考虑过给两个toolBar分别做垂直布局,让一个setAlignment(Qt::AlignTop),一个AlignBottom,很不幸,第二个toolBar还是水平)。所以这里我干脆只使用一个toolBar,难点就在于如何在中间制造一段空白。
制造空白的思路就是做一个QAction,里面包含一个可以扩展高度的spacer,那么spacer后添加的QAction,自然可以沉到底部。
下面是代码,注释很清楚了,不再多说。其中:
- 各个QAction都是已经实现好的功能
createToolBars()
放置在MainWindow的构造函数之中,ui->setupUi(this);
之后。
void MainWindow::createToolBars() {
// 上面的action
ui->serviceToolBar->addAction(ui->actionSynoOnline);
ui->serviceToolBar->addAction(ui->actionDNAStudioOnline);
ui->serviceToolBar->addAction(ui->actionToolsOnline);
ui->serviceToolBar->addAction(ui->actionOrderSysOnline);
// 中间制造一些空间
QWidget* customWidget = new QWidget();
// 创建布局
QBoxLayout* layout = new QVBoxLayout(customWidget);
layout->setContentsMargins(0, 0, 0, 0);
// 参数说明:第一个参数是Spacer的宽度,第二个是高度,单位像素
// 第三个参数是Spacer在水平方向上、调整大小时使用的策略
// Preferred表示占用常规的空间
// 第四个参数是Spacer在垂直方向上、调整大小时使用的策略
// Expanding表示可以扩展以填充多余的空间
layout->addSpacerItem(new QSpacerItem(0, 0, QSizePolicy::Preferred, QSizePolicy::Expanding));
// 将QWidget包装成一个QAction
QWidgetAction* widgetAction = new QWidgetAction(this);
widgetAction->setDefaultWidget(customWidget);
// 再将QAction添加到QToolBar
ui->serviceToolBar->addAction(widgetAction);
// 添加一个隔断
ui->serviceToolBar->addSeparator();
// 添加剩余的几个action
ui->serviceToolBar->addAction(ui->actionContact);
ui->serviceToolBar->addAction(ui->actionSettings);
}