Qt功能区:Ribbon控件

1. 按钮

1.1 多选按钮

软件功能:用于实现Category的名称居中。
SARibbonCheckBox继承于QCheckBox,使用方法完全相同。

SARibbonCheckBox* checkBox = new SARibbonCheckBox(this);
    checkBox->setText(tr("Alignment Center"));
    checkBox->setObjectName("checkBoxAlignmentCenter");
    checkBox->setWindowTitle(checkBox->text());
    pannelStyle->addSmallWidget(checkBox);
    connect(checkBox, &SARibbonCheckBox::stateChanged, this, [=](int state) {
        if (state == static_cast<int>(Qt::Checked)) {
            ribbonBar()->setRibbonAlignment(SARibbonAlignment::AlignCenter);
        }
        else {
            ribbonBar()->setRibbonAlignment(SARibbonAlignment::AlignLeft);
        }
        });

在这里插入图片描述

1.2 按钮

Ribbon中的按钮采用QAction类来实现。

SARibbonMenu

***用于在按钮中添加菜单项。***SARibbonMenu继承于QMenu,其中方法和属性均可用。

class SA_RIBBON_EXPORT SARibbonMenu : public QMenu
{
    Q_OBJECT
public:
    explicit SARibbonMenu(QWidget* parent = nullptr);
    explicit SARibbonMenu(const QString& title, QWidget* parent = nullptr);
    ~SARibbonMenu();
    QAction* addRibbonMenu(SARibbonMenu* menu);
    SARibbonMenu* addRibbonMenu(const QString& title);
    SARibbonMenu* addRibbonMenu(const QIcon& icon, const QString& title);
    QAction* addWidget(QWidget* w);
};

创建菜单:

SARibbonMenu* menu = new SARibbonMenu(this);
    QAction* a = nullptr;
    {
        QIcon itemicon = QIcon(":/icon/icon/item.svg");
        for (int i = 0; i < 5; ++i) {
            a = menu->addAction(itemicon, tr("item %1").arg(i + 1));
            a->setObjectName(QStringLiteral("item %1").arg(i + 1));
        }
    }

小按钮工具Button

	//创建第一个 QToolButton::MenuButtonPopup模式菜单弹出按钮,点击弹出按钮弹出菜单项
    QAction* actPopup = createAction(tr("test 1"), ":/File/test1","actPopup");
    QVariant temp("Test");
    actPopup->setData(temp);
    actPopup->setMenu(menu);
    actPopup->setToolTip(tr("use QToolButton::MenuButtonPopup mode"));
    pannelToolButtonStyle->addMediumAction(actPopup, QToolButton::MenuButtonPopup);
    //立即弹出模式工具按钮,点击菜单栏即可弹出菜单项
    QAction* actInstant = createAction(tr("test 2"), ":/File/test2", "actInstant");
    actInstant->setMenu(menu);
    actInstant->setToolTip(tr("use QToolButton::InstantPopup mode"));
    pannelToolButtonStyle->addMediumAction(actInstant, QToolButton::InstantPopup);

在这里插入图片描述

大按钮(工具Button)

//大按钮:延时弹出模式
    QAction* actDelayedPopup = createAction(tr(u8"延时弹出"), ":/File/foldDPopup","actDelayedPopup");
    actDelayedPopup->setMenu(menu);
    pannelToolButtonStyle->addLargeAction(actDelayedPopup, QToolButton::DelayedPopup);

    大按钮:菜单弹出模式
    QAction* actMenuPopup = createAction(tr(u8"菜单弹出"), ":/File/BMPopup", "actMenuPopup");
    actMenuPopup->setMenu(menu);
    pannelToolButtonStyle->addLargeAction(actMenuPopup, QToolButton::MenuButtonPopup);

    //大按钮:立即弹出模式
    QAction* actBInstant = createAction(tr(u8"立即弹出"), ":/File/FoldInstant", "actBInstant");
    actBInstant->setMenu(menu);
    pannelToolButtonStyle->addLargeAction(actBInstant, QToolButton::InstantPopup);

    //大按钮:菜单弹出模式,可按下
    QAction* actMenuPopupC = createAction(tr(u8"按下弹出"), ":/File/FoldInstant", "actMenuPopupC");
    actMenuPopupC->setMenu(menu);
    actMenuPopupC->setCheckable(true);
    pannelToolButtonStyle->addLargeAction(actMenuPopupC, QToolButton::MenuButtonPopup);
    
//大按钮:普通
    QAction* actPushButton = createAction(tr(u8"普通按钮"), ":/File/pushButton", "actPushButton");
    actPushButton->setCheckable(true);
    pannelToolButtonStyle->addLargeAction(actPushButton);
    connect(actPushButton, &QAction::toggled, this, [this](bool on) {
        if (on) { QMessageBox::information(this, tr(u8"按钮状态"), tr(u8"按钮被按下")); };
        });

在这里插入图片描述

2. 下拉列表框SARibbonComboBox

2.1 简介

实现功能:设置程序窗口的样式
窗口的样式为枚举类型:

enum class SARibbonTheme
{
	RibbonThemeOffice2013,      ///< office2013主题
	RibbonThemeOffice2016Blue,  ///< office2016-蓝色主题
	RibbonThemeOffice2021Blue,  ///< office2021-蓝色主题
	RibbonThemeWindows7,        ///< win7主题
	RibbonThemeDark,            ///< 暗色主题
	RibbonThemeDark2
};

SARibbonComboBox直接继承于QComboBox,并没有添加什么函数
在这里插入图片描述

 * @brief QComboBox的Ribbon显示,可以显示QIcon和windowTitle在左侧
 */
class SA_RIBBON_EXPORT SARibbonComboBox : public QComboBox
{
    Q_OBJECT
public:
    explicit SARibbonComboBox(QWidget *parent = nullptr);
    ~SARibbonComboBox();
};

2.2 代码实现

//设置下拉列表框
    mComboboxRibbonTheme = new SARibbonComboBox();
    mComboboxRibbonTheme->setWindowTitle(tr("RibbonTheme"));
    mComboboxRibbonTheme->setObjectName("RibbonTheme");
    mComboboxRibbonTheme->addItem("Theme Win7", static_cast<int>(SARibbonTheme::RibbonThemeWindows7));
    mComboboxRibbonTheme->addItem("Theme Office2013", static_cast<int>(SARibbonTheme::RibbonThemeOffice2013));
    mComboboxRibbonTheme->addItem("Theme Office2016 Blue", static_cast<int>(SARibbonTheme::RibbonThemeOffice2016Blue));
    mComboboxRibbonTheme->addItem("Theme Office2021 Blue", static_cast<int>(SARibbonTheme::RibbonThemeOffice2021Blue));
    mComboboxRibbonTheme->addItem("Theme Dark", static_cast<int>(SARibbonTheme::RibbonThemeDark));
    mComboboxRibbonTheme->addItem("Theme Dark2", static_cast<int>(SARibbonTheme::RibbonThemeDark2));
    mComboboxRibbonTheme->setCurrentIndex(mComboboxRibbonTheme->findData(static_cast<int>(ribbonTheme())));
    pannelStyle->addSmallWidget(mComboboxRibbonTheme);
    connect(mComboboxRibbonTheme,
        QOverload< int >::of(&SARibbonComboBox::currentIndexChanged),  //信号重载,Overload 是一个模板类,用于显式指定要连接的信号或槽的参数类型,从而消除歧义
        this,
        [=](int index) {
            SARibbonTheme t = static_cast<SARibbonTheme>(index);
            setRibbonTheme(t);
        });

在这里插入图片描述

3.编辑框

SARibbonLineEdit继承于QLineEdit,使用方法相同。

class SA_RIBBON_EXPORT SARibbonLineEdit : public QLineEdit
{
    Q_OBJECT
public:
	explicit SARibbonLineEdit(QWidget *parent = nullptr);
	explicit SARibbonLineEdit(const QString &text, QWidget *parent = nullptr);
    ~SARibbonLineEdit();
};
SARibbonLineEdit* lineEdit = new SARibbonLineEdit(this);
    lineEdit->setObjectName("Line Edit");
    lineEdit->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Fixed);
    lineEdit->setWindowTitle("Line Edit");
    lineEdit->setText("SARibbonLineEdit");
    pannelEditStyle->addSmallWidget(lineEdit);

在这里插入图片描述

4. 容器控件

4.1 SARibbonButtonGroupWidget

该控件继承于QFrame.
方法:

// 图标尺寸
    void setIconSize(const QSize& ic);
    QSize iconSize() const;
    // 生成并添加一个action
    QAction* addAction(QAction* a,
                       Qt::ToolButtonStyle buttonStyle          = Qt::ToolButtonIconOnly,
                       QToolButton::ToolButtonPopupMode popMode = QToolButton::DelayedPopup);
    QAction* addAction(const QString& text,
                       const QIcon& icon,
                       Qt::ToolButtonStyle buttonStyle          = Qt::ToolButtonIconOnly,
                       QToolButton::ToolButtonPopupMode popMode = QToolButton::DelayedPopup);
    QAction* addMenu(QMenu* menu,
                     Qt::ToolButtonStyle buttonStyle          = Qt::ToolButtonIconOnly,
                     QToolButton::ToolButtonPopupMode popMode = QToolButton::InstantPopup);
    QAction* addSeparator();
    QAction* addWidget(QWidget* w);
    // 从ButtonGroupWidget中把action对应的button提取出来,如果action没有对应的button,就返回nullptr
    SARibbonControlButton* actionToRibbonControlToolButton(QAction* action);

    QSize sizeHint() const override;
    QSize minimumSizeHint() const override;

实例

//按钮组:贴靠位置;利用按钮组合框信号来处理函数,每个控件可以携带data
    SARibbonButtonGroupWidget* btnGroup2 = new SARibbonButtonGroupWidget(pannel1);//父类为pannel1
    btnGroup2->setObjectName("ButtonGroupWidget2");
    btnGroup2->setWindowTitle("ButtonGroupWidget2");
    QAction* titleAlgnment = createAction(tr(u8"右对齐"), ":/edit/right",tr("Align Right"));
    titleAlgnment->setProperty("align", (int)Qt::AlignRight | Qt::AlignVCenter);
    btnGroup2->addAction(titleAlgnment);
    titleAlgnment = createAction(tr(u8"左对齐"), ":/edit/left", tr("Align Left"));
    titleAlgnment->setProperty("align", (int)Qt::AlignLeft | Qt::AlignVCenter);
    btnGroup2->addAction(titleAlgnment);
    titleAlgnment = createAction(tr(u8"居中"), ":/edit/center", tr("Align Center"));
    titleAlgnment->setProperty("align", (int)Qt::AlignCenter);
    btnGroup2->addAction(titleAlgnment);
    pannel1->addWidget(btnGroup2, SARibbonPannelItem::Small);

connect(btnGroup2, &SARibbonButtonGroupWidget::actionTriggered, this, &QtMainWindowRibbon::onButtonGroupActionTriggered);

void QtMainWindowRibbon::onButtonGroupActionTriggered(QAction* act)
{
    QVariant v = act->property("align");
    if (v.isValid()) {
        Qt::Alignment al = static_cast<Qt::Alignment>(v.toInt());
        if (!ribbonBar()) {
            return;
        }
        ribbonBar()->setWindowTitleAligment(al);
        ribbonBar()->repaint();
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值