手记

4.4 工具栏

上一节我们讲了菜单栏,这节我们来看看主窗口程序的工具栏QToolBar

4.4.1 QToolBar属性

image

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界面

image

1)新建一个菜单栏File,并在菜单中添加Action1,Action2

2)将这两个动作按钮拖拽到工具栏中。

3)在中心窗口中分别添加两个checkbox,两个QListWidget,并置于网格布局中。

4)双击左侧的listWidget,添加条目,并在右侧的属性框选择。

image

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_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);
}

编译运行程序,尝试着改变属性,看看都有哪些变化。

image



作者:小豆君的干货铺
链接:https://www.jianshu.com/p/ccae7607c19a


0人推荐
随时随地看视频
慕课网APP