• Qt学习总结之QToolButton


    一、简述

    QToolButton类提供了用于命令或选项可以快速访问的按钮,通常可以用在QToolBar里面。

    工具按钮和普通的命令按钮不同,通常不显示文本,而显示图标。

    二、详细描述

    当使用QToolBar::addAction()添加一个新的(或已存在的)QAction至工具栏时,工具按钮通常被创建 。也可以用同样的方式构建工具按钮和其它部件,并设置它们的布局。

    QToolButton支持自动浮起,在自动浮起模式中,只有在鼠标指向它的时候才绘制三维框架。当按钮被用在QToolBar里时,这个特征会被自动启用,可以使用setAutoRaise()来改变。

    按钮的外观和尺寸可通过setToolButtonStyle()和setIconSize()来调节。当在QMainWindow的QToolBar里使用时,按钮会自动地调节来适合QMainWindow的设置(见QMainWindow::setToolButtonStyle() 和QMainWindow::setIconSize())。

    工具按钮可以提供一个弹出菜单,使用setMenu()来进行设置。通过setPopupMode()来设置菜单的弹出模式,缺省模式是DelayedPopupMode,这个特征有时对于网页浏览器中的“后退”按钮有用,在按下按钮一段时间后,会弹出一个显示所有可以后退浏览的可能页面的菜单列表,默认延迟600毫秒,可以用setPopupDelay()进行调整。

    三、常用接口

    void setMenu(QMenu * menu)
    设置按钮的弹出菜单。和QPushButton用法类似,详见:Qt之QPushButton

    void setPopupMode(ToolButtonPopupMode mode)
    设置弹出菜单的方式,默认情况下,设置为DelayedPopup(延迟弹出)。

    枚举QToolButton::ToolButtonPopupMode:

    常量描述
    QToolButton::DelayedPopup0按下按钮一定时间后(超时风格依赖,参考:QStyle::SH_ToolButton_PopupDelay),显示菜单。一个典型案例:浏览器中工具栏的“后退”按钮。
    QToolButton::MenuButtonPopup1这种模式下,工具按钮显示一个特殊的箭头以指示菜单是否存在,按下按钮的箭头部分时显示菜单。
    QToolButton::InstantPopup2按下工具按钮时菜单显示,无延迟。这种模式下,按钮自身的动作不触发。

    void setToolButtonStyle(Qt::ToolButtonStyle style)
    设置按钮风格,只显示一个图标,文本或文本位于图标旁边、下方。默认值是Qt::ToolButtonIconOnly。

    枚举Qt::ToolButtonStyle:

    常量描述
    Qt::ToolButtonIconOnly0只显示图标
    Qt::ToolButtonTextOnly1只显示文本
    Qt::ToolButtonTextBesideIcon2文本显示在图标旁边
    Qt::ToolButtonTextUnderIcon3文本显示在图标下边
    Qt::ToolButtonFollowStyle4遵循QStyle::StyleHint

    void setArrowType(Qt::ArrowType type)
    设置按钮是否显示一个箭头,而不是一个正常的图标。这将显示一个箭头作为QToolButton的图标。
    默认情况下,这个属性被设置为Qt::NoArrow。

    枚举Qt::ArrowType:

    常量
    Qt::NoArrow0
    Qt::UpArrow1
    Qt::DownArrow2
    Qt::LeftArrow3
    Qt::RightArrow4

    效果如下所示:
    在这里插入图片描述
    源码:

    mainwindow.c
    #include "mainwindow.h"
    #include "ui_mainwindow.h"
    
    
    MainWindow::MainWindow(QWidget *parent) :
        QMainWindow(parent),
        ui(new Ui::MainWindow)
    {
        ui->setupUi(this);
    
        this->resize(800,600);
    
        m_toolbutton = new QToolButton(this);
        m_toolbutton->setGeometry(100,100,100,50);
    
        m_toolbutton->setArrowType(Qt::LeftArrow);
        m_toolbutton->setText("left arrow");
        m_toolbutton->setToolButtonStyle(Qt::ToolButtonTextUnderIcon);
        m_toolbutton->setStyleSheet("QToolButton{border: none; background: rgb(68, 69, 73); color: rgb(0, 255, 0);}");
    }
    
    MainWindow::~MainWindow()
    {
        delete ui;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26

    mainwindow.h
    #ifndef MAINWINDOW_H
    #define MAINWINDOW_H

    #include 
    #include 
    
    namespace Ui {
    class MainWindow;
    }
    
    class MainWindow : public QMainWindow
    {
        Q_OBJECT
    
    public:
        explicit MainWindow(QWidget *parent = nullptr);
        ~MainWindow();
    
    private:
        Ui::MainWindow *ui;
    
        QToolButton *m_toolbutton;
    };
    
    #endif // MAINWINDOW_H
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22

    四、Qtoolbutton与Qaction的结合

    QAction可以理解为一个动作数据,包含了这个同坐相关的图标、文本、是否可用等数据和状态,以及连接对应的槽函数,用于执行这个动作。

    QToolButton则可以使用QAction对象作为后端,显示这个QAction的图标,关联其是否可用的状态。

    效果图:
    在这里插入图片描述
    源码:

    mainwindow.c

    #include "mainwindow.h"
    #include "ui_mainwindow.h"
    #include 
    #include 
    #include 
    
    
    MainWindow::MainWindow(QWidget *parent) :
        QMainWindow(parent),
        ui(new Ui::MainWindow)
    {
        ui->setupUi(this);
    
        this->resize(800,600);
    
        m_toolbutton1 = new QToolButton(this);
        m_toolbutton1->setGeometry(100,100,100,50);
    
        m_toolbutton2 = new QToolButton(this);
        m_toolbutton2->setGeometry(300,100,100,30);
    
        m_toolbutton1->setArrowType(Qt::LeftArrow);
        m_toolbutton1->setText("left arrow");
        m_toolbutton1->setToolButtonStyle(Qt::ToolButtonTextUnderIcon);
        m_toolbutton1->setStyleSheet("QToolButton{border: none; background: rgb(68, 69, 73); color: rgb(0, 255, 0);}");
    
    //    m_toolbutton2->setArrowType(Qt::RightArrow);
        m_toolbutton2->setText("select");
        m_toolbutton2->setToolButtonStyle(Qt::ToolButtonTextBesideIcon);
    
        m_toolbutton2->setPopupMode(QToolButton::MenuButtonPopup);
    
        QMenu *menu = new QMenu(this);
        QMenu *submenu = new QMenu(this);
    
        QAction *action1 = new QAction(menu);
        QAction *action2 = new QAction(menu);
    
        action1->setText("最大化");
        action2->setText("最小化");
    
        menu->addAction("最大化");
        menu->addAction("最小化");
        menu->addAction("还原");
    
        submenu->addAction("全选");
        submenu->addAction("取消");
        submenu->addAction("退出");
        submenu->setTitle("其他");
    
        menu->addMenu(submenu);
        m_toolbutton2->setMenu(menu);
    
        connect(m_toolbutton2,&QToolButton::triggered,this,&MainWindow::slot_toolbutton2);
    
    
    }
    
    MainWindow::~MainWindow()
    {
        delete ui;
    }
    
    void MainWindow::slot_toolbutton2()
    {
      qDebug()<<m_toolbutton2->menu()->actions();
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
    • 65
    • 66
    • 67

    mainwindow.h

    #ifndef MAINWINDOW_H
    #define MAINWINDOW_H
    
    #include 
    #include 
    
    namespace Ui {
    class MainWindow;
    }
    
    class MainWindow : public QMainWindow
    {
        Q_OBJECT
    
    public:
        explicit MainWindow(QWidget *parent = nullptr);
        ~MainWindow();
    
    private slots:
        void slot_toolbutton2();
    private:
        Ui::MainWindow *ui;
    
        QToolButton *m_toolbutton1;
    
        QToolButton *m_toolbutton2;
    };
    
    #endif // MAINWINDOW_H
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
  • 相关阅读:
    一文详解 requests 库中 json 参数和 data 参数的用法
    Spring Boot中JUnit 4与JUnit 5的如何共存
    Python 霸榜的一周,又有什么新 AI 力作呢?「GitHub 热点速览」
    测试管理并不好做,做好以下几点可直上云霄!
    面试突击39:synchronized底层是如何实现的?
    为什么全都来当测试/开发程序员?最吸引人的地方......
    PZ-3B-70E2A-10、PZ-6B-220E2A-20电控比例压力流量驱动泵放大器
    图信号处理论文
    二十二、设计模式之访问者模式
    [零基础学习Vue2+webpack项目]的webpack对vue3进行编码打包的详解(2)
  • 原文地址:https://blog.csdn.net/qq_27726087/article/details/126281671