上一节我们讲了菜单栏,这节我们来看看主窗口程序的工具栏QToolBar
4.4.1 QToolBar属性
QToolBar继承自QWidget。
1 allowedAreas 保存工具栏可放置在哪个位置(相对于中心窗口)
Qt::LeftToolBarArea 0x1 可放置在左侧
Qt::RightToolBarArea 0x2 右侧
Qt::TopToolBarArea 0x4上侧
Qt::BottomToolBarArea 0x8 下侧
Qt::AllToolBarAreas 0xf 所有
Qt::NoToolBarArea 0 不能放置
这里每个枚举的值分别为,0x1 0x2等,这表明这些枚举值可以使用或“|”运算符,即可以Qt::LeftToolBarArea|Qt::RightToolBarArea组合,表明工具栏可以被放置在左侧或者右侧。
在平时编程中如果遇到类似的情况,我们也可以使用类似的方法。
Qt::ToolBarAreas是一个QFlags<ToolBarArea>类型,当我们遇到存在“或”意义的枚举类型时,最好可以使用Q_DECLARE_FLAGS()宏将其声明为QFlags类型,这样会给我们带来很多方便。
关于QFlags的内容,小豆君会在后面的章节中具体介绍,这里先提一下,有兴趣的朋友可以搜索相关资料。
2 floatable 是否可漂浮
如果为true,则工具栏可以用鼠标拖拽出来,变成一个独立的小窗口。
3 floating 是否处于漂浮状态
如果为true,则说明工具栏已经用鼠标拖拽出来,变成了一个独立的小窗口。
4 iconSize 工具栏图标大小
5 movable 是否可以被移动
这个属性保存工具栏是否可以被移动。
如果为false,左侧的可移动标识会隐藏掉。
6 orientation 工具栏方向
Qt::Horizontal 水平
Qt::Vertical 垂直
7 toolButtonStyle 工具按钮样式
工具栏一般由图标和文字组成,用于醒目的提醒用户该按钮的功能,这个样式就定义了图标和文字的配合方式。
Qt::ToolButtonIconOnly 只显示图标
Qt::ToolButtonTextOnly 只显示文字
Qt::ToolButtonTextBesideIcon 在图标右侧显示文字
Qt::ToolButtonTextUnderIcon 在图标下方显示文字
Qt::ToolButtonFollowStyle 根据StyleHint中的设定而显示
另外,
- 可以通过addWidget,insertWidget, 添加自定义的窗口。
- 可以使用addSeparator,insertSeparator添加间隔线,从而分组。
4.4.2 示例
新建MainWindowToolBar项目,类名MainWindowToolBar,继承自QMainWindow。
编写如下的ui界面
1)新建一个菜单栏File,并在菜单中添加Action1,Action2
2)将这两个动作按钮拖拽到工具栏中。
3)在中心窗口中分别添加两个checkbox,两个QListWidget,并置于网格布局中。
4)双击左侧的listWidget,添加条目,并在右侧的属性框选择。
mainwindowtoolbar.h
#ifndef MAINWINDOWTOOLBAR_H #define MAINWINDOWTOOLBAR_H #include <QMainWindow> namespace Ui { class MainWindowToolBar; } class QListWidgetItem; class MainWindowToolBar : public QMainWindow { Q_OBJECT public: explicit MainWindowToolBar(QWidget *parent = 0); ~MainWindowToolBar(); private slots: //放置区域槽函数 void on_listWidget_area_itemChanged(QListWidgetItem *item); //工具栏图标样式槽函数 void onBtnStyleChanged(QListWidgetItem *item); void on_listWidget_button_itemChanged(QListWidgetItem *item); void on_check_floatable_toggled(bool checked); void on_check_movable_toggled(bool checked); private: Ui::MainWindowToolBar *ui; }; #endif // MAINWINDOWTOOLBAR_H
mainwindowtoolbar.cpp
#include <QDebug> #include "mainwindowtoolbar.h" #include "ui_mainwindowtoolbar.h" MainWindowToolBar::MainWindowToolBar(QWidget *parent) : QMainWindow(parent), ui(new Ui::MainWindowToolBar) { ui->setupUi(this); QIcon icon(":/image/qq.png"); ui->actionAction1->setIcon(icon); ui->mainToolBar->setIconSize(QSize(30, 30)); connect(ui->listWidget_button, SIGNAL(itemChanged(QListWidgetItem*)), this, SLOT(onBtnStyleChanged(QListWidgetItem *))); } MainWindowToolBar::~MainWindowToolBar() { delete ui; } void MainWindowToolBar::on_listWidget_area_itemChanged(QListWidgetItem *item) { //获取该item所代表的位置flag int row = ui->listWidget_area->row(item); int flg = Qt::LeftToolBarArea << row; //获取工具栏原来的位置flag Qt::ToolBarAreas areas = ui->mainToolBar->allowedAreas(); //areas为QFlags<Qt::ToolBarArea>类型,所以只需将该位置打开或关闭即可 areas.setFlag((Qt::ToolBarArea)flg, item->checkState() == Qt::Checked); //设置新flags ui->mainToolBar->setAllowedAreas(areas); } void MainWindowToolBar::onBtnStyleChanged(QListWidgetItem *item) { //这里是为了获取单选效果 disconnect(ui->listWidget_button, SIGNAL(itemChanged(QListWidgetItem*)), this, SLOT(onBtnStyleChanged(QListWidgetItem *))); static QListWidgetItem* lastItem = ui->listWidget_button->item(0); if (lastItem != item && item->checkState() == Qt::Checked) { int row = ui->listWidget_button->row(item); ui->mainToolBar->setToolButtonStyle((Qt::ToolButtonStyle)row); lastItem->setCheckState(Qt::Unchecked); lastItem = item; } else { item->setCheckState(Qt::Checked); } connect(ui->listWidget_button, SIGNAL(itemChanged(QListWidgetItem*)), this, SLOT(onBtnStyleChanged(QListWidgetItem *))); } void MainWindowToolBar::on_check_floatable_toggled(bool checked) { ui->mainToolBar->setFloatable(checked); } void MainWindowToolBar::on_check_movable_toggled(bool checked) { ui->mainToolBar->setMovable(checked); }
编译运行程序,尝试着改变属性,看看都有哪些变化。
好了,关于工具栏的分享就到这里了,我们下节再见。
如果你想要获得更多干货,请关注我的微信公众号:小豆君,只要关注,便可加入小豆君为大家创建的C++\Qt交流群,方便讨论学习。