4.4 工具栏

作者: 223480235e8e | 来源:发表于2018-11-29 22:51 被阅读3次

    上一节我们讲了菜单栏,这节我们来看看主窗口程序的工具栏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

    好了,关于工具栏的分享就到这里了,我们下节再见。

    最后也希望大家多多支持小豆君的创作,关注小豆君的公众号“小豆君Qt分享”,最新文章都会在公众号第一时间发布,或者你有不懂的问题,关注公众号后,可加好友或进Qt群获得答案。

    相关文章

      网友评论

        本文标题:4.4 工具栏

        本文链接:https://www.haomeiwen.com/subject/zriqcqtx.html