Qt学习总结之QToolButton

本文介绍了Qt库中的QToolButton类,该类用于创建工具栏按钮,支持图标显示、自动浮起效果及弹出菜单等功能。文章还展示了如何使用QAction与QToolButton结合实现更丰富的交互。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、简述

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

mainwindow.h
#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>
#include <QToolButton>

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

四、Qtoolbutton与Qaction的结合

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

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

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

mainwindow.c

#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QAction>
#include <QMenu>
#include <QDebug>


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

mainwindow.h

#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>
#include <QToolButton>

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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

嵌入式小龙

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值