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