如何用Qt实现ribbon office风格?附源码

Qt是一个跨平台框架,通常用作图形工具包,它不仅创建CLI应用程序中非常有用。而且它也可以在三种主要的台式机操作系统以及移动操作系统(如Symbian,Nokia Belle,Meego Harmattan,MeeGo或BB10)以及嵌入式设备,Android(Necessitas)和iOS的端口上运行。现在我们为你提供了免费的试用版。

下载Qt6最新试用版

Qt组件推荐:

  • QtitanRibbon下载试用: 遵循Microsoft Ribbon UI Paradigm for Qt技术的Ribbon UI组件,致力于为Windows、Linux和Mac OS X提供功能完整的Ribbon组件。
  • QtitanChart | 下载试用 :是一个C ++库,代表一组控件,这些控件使您可以快速地为应用程序提供漂亮而丰富的图表。并且支持所有主要的桌面

平台:win10 64bit + VS2013 update5 + Qt5.6.0 64bit(色彩效果仿照windows的写字板,效果通过QSS实现)

新建一个Qt应用程序工程,删掉UI默认的菜单栏和工具栏。

添加一个widget和一个scrollArea到UI,两个控件采用垂直布局。widget中放置一个pushButton和一个TabWidget,widget采用水平布局,scrollArea中放置一个widget,采用水平布局(垂直布局也可),完成后效果如下:

说说我的思路吧!左上方的按钮打算做成一个文件菜单,里面有打开、保存、关于等按钮,tabwidget用来模仿Ribbon效果,下方的scrollArea就是配角而已,看着好看而已的,我们继续。。。

将主界面和上方widget的layout边距设为0,spacing也设为0,修改按钮和tabwidget的文字。设置scrollArea中的widget背景色为白色,固定一个合适的宽度,设置srollArea的背景色(ui.scrollArea->setBackgroundRole(QPalette::Mid);),完成后效果如下:

我们需要把文件菜单放到主页的左边,然后主页这些标签依次向右移动。按钮放到tabwidget上面好办,绝对位置即可,可是tabwidge的标签怎么移动呢?这就要借助QSS了,代码如下:

按钮移动代码:

ui.pushButton_MenuFile->setParent(ui.tabWidget);
tabWidget的tab移动QSS代码:

#tabWidget_Main::tab-bar {
left: 65px;
}

控制一下文件按钮的大小:

#pushButton_MenuFile{
min-width:50px;
max-width:50px;
min-height:22px;
max-height:22px;
}

控制一下tabbar大小:

#tabWidget_Main QTabBar::tab{
min-width:60px;
max-width:60px;
min-height:22px;
max-height:22px;
}

完成后效果如下:

 

设置按钮效果:

#pushButton_MenuFile{
color:white;
border: 1px solid #416ABD;
border-top-left-radius: 2px;
border-top-right-radius: 2px;
background-color: qlineargradient(spread:pad, x1:0, y1:0, x2:0, y2:1,
stop:0 #467FBD, stop:0.5 #2A5FAC,stop:0.51 #1A4088, stop:1 #419ACF);
}
#pushButton_MenuFile::hover{
background-color: qlineargradient(spread:pad, x1:0, y1:0, x2:0, y2:1,
stop:0 #7BB2EB, stop:0.5 #477ECD,stop:0.51 #114ECF, stop:1 #80E1FF);
}
#pushButton_MenuFile::pressed{
background-color: qlineargradient(spread:pad, x1:0, y1:0, x2:0, y2:1,
stop:0 #467BBB, stop:0.5 #2F63AE,stop:0.51 #1C438A, stop:1 #358BC9);
}

设置tabbar的效果:

#tabWidget_Main QTabBar::tab {
background: transparent;
margin-left: 4px;
margin-right: 4px;
}
#tabWidget_Main QTabBar::tab:selected, QTabBar::tab:hover {
border-top-left-radius: 2px;
border-top-right-radius: 2px;
}
#tabWidget_Main::tab-bar {
border: 1px solid #BAC9DB;
}
#tabWidget_Main QTabBar::tab:selected{
border: 1px solid #BAC9DB;
background: white;
border-bottom-color: #FFFFFF;
}
#tabWidget_Main QTabBar::tab:hover:!selected{
border: 1px solid #ECBC3D;
}
#tabWidget_Main QTabBar::tab:!selected {
margin-top: 1px;
}

然后效果如下:

 

基本的效果已经出来了,下面我们设置文件菜单的效果,如果直接使用QMenu,设置效果有很多限制,好在Qt提供了QWidgetAction,可以将菜单做成Widget,再使用QSS,感觉棒棒哒!首先我们设置一个菜单的Widget的类:

class MenuItemWidget : public QWidget
{
Q_OBJECT

public:
MenuItemWidget(const QPixmap& icon, const QString& text, QWidget *parent = 0)
{
QLabel* label_Icon = new QLabel(this);
label_Icon->setFixedSize(32, 32);
label_Icon->setScaledContents(true);
label_Icon->setPixmap(icon);

QLabel* label_Text = new QLabel(text,this);

QHBoxLayout* layout = new QHBoxLayout;
layout->setContentsMargins(20, 6, 50, 6);
layout->setSpacing(10);
layout->addWidget(label_Icon);
layout->addWidget(label_Text);
setLayout(layout);

setFixedWidth(240);
}
~MenuItemWidget()
{}

protected:
void paintEvent(QPaintEvent* e) Q_DECL_OVERRIDE{
QStyleOption opt;
opt.init(this);
QPainter p(this);
style()->drawPrimitive(QStyle::PE_Widget, &opt, &p, this);
}

private:
};

如果自己继承QWidget,则需要向上面代码那样重写paintEvent函数,否则无法使用QSS,Qt助手上面说。

下面为文件按钮添加菜单:

QMenu* menu = new QMenu(this);
ui.pushButton_MenuFile->setMenu(menu);

QWidgetAction* actionNew = new QWidgetAction(this);
actionNew->setDefaultWidget(new MenuItemWidget(QPixmap(":/png/file_new.png"), QString::fromStdWString(L"新建"), this));
menu->addAction(actionNew);


QWidgetAction* actionOpen = new QWidgetAction(this);
actionOpen->setDefaultWidget(new MenuItemWidget(QPixmap(":/png/file_open.png"), QString::fromStdWString(L"打开"), this));
menu->addAction(actionOpen);

QWidgetAction* actionSave = new QWidgetAction(this);
actionSave->setDefaultWidget(new MenuItemWidget(QPixmap(":/png/file_save.png"), QString::fromStdWString(L"保存"), this));
menu->addAction(actionSave);

QWidgetAction* actionSaveAs = new QWidgetAction(this);
actionSaveAs->setDefaultWidget(new MenuItemWidget(QPixmap(":/png/file_saveas.png"), QString::fromStdWString(L"另存为"), this));
menu->addAction(actionSaveAs);

menu->addSeparator();

QWidgetAction* actioPrint = new QWidgetAction(this);
actioPrint->setDefaultWidget(new MenuItemWidget(QPixmap(":/png/file_print.png"), QString::fromStdWString(L"打印"), this));
menu->addAction(actioPrint);

menu->addSeparator();

QWidgetAction* actionAout= new QWidgetAction(this);
actionAout->setDefaultWidget(new MenuItemWidget(QPixmap(":/png/about.png"), QString::fromStdWString(L"关于"), this));
menu->addAction(actionAout);

QWidgetAction* actionExit = new QWidgetAction(this);
actionExit->setDefaultWidget(new MenuItemWidget(QPixmap(":/png/exit.png"), QString::fromStdWString(L"退出"), this));
menu->addAction(actionExit);
connect(actionExit, SIGNAL(triggered()), this, SLOT(close()));

设置菜单的QSS:

QMenu {
background-color: #FCFCFC;
border: 1px solid #8492A6;
}
QMenu::item {
background-color: transparent;
}
MenuItemWidget::hover{
border: 1px solid #FFB700;
background-color: qlineargradient(spread:pad, x1:0, y1:0, x2:0, y2:1,stop:0 #FEF9F4, stop:0.38 #FDE0BD,stop:0.39 #FFCE69, stop:1 #FFFFE7);
}
QMenu::item:selected {
background-color: #654321;
}

实现后效果如下:

接下来设置tabwidget中的groubox的QSS:

#tabWidget_Main QGroupBox{
border-left: 1px solid gray;
border-top: 0px solid gray;
}

#tabWidget_Main QGroupBox::title {
color: #738399;
subcontrol-position: bottom center;
}

效果如下:

 

最后的美化:设置字体为微软雅黑,设置tabWidget背景色、隐藏文件按钮菜单小按钮,最终效果如下:

如果需要实现双击tab标签关闭tabwidget的面板,连接标签的doubleClicked信号:

connect(ui.tabWidget_Main, SIGNAL(tabBarDoubleClicked(int)), this, SLOT(hideOrShowTabWidget()));

hideOrShowTabWidget()函数实现如下:

void MainWindow::hideOrShowTabWidget()
{
static bool isTabWidgetHide = false;
ui.widget_Top->setFixedHeight(isTabWidgetHide? 150:25);
isTabWidgetHide = !isTabWidgetHide;
}

版权声明:本文为CSDN博主「一只蚂蚁2」的原创文章
原文链接:https://blog.csdn.net/csloudx/article/details/51029807

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: Qt自定义Ribbon菜单可以通过以下步骤完成。 首先,创建一个新的Qt项目。在项目中包含QtRibbon控件相关的头文件和库。 其次,定义你想要的Ribbon菜单的外观和布局。可以使用Qt提供的默认样式,也可以通过修改样式表来自定义外观。 接下来,创建菜单项。可以使用QAction或者QMenu来创建菜单项,然后将它们添加到Ribbon菜单中。 然后,设置菜单项的图标和文字。可以使用QIcon类来设置菜单项的图标,使用setText()方法来设置菜单项的文字。 接着,为菜单项添加功能。可以连接菜单项的triggered()信号到槽函数中,实现菜单项的点击功能。 最后,展示Ribbon菜单。将Ribbon菜单添加到主窗口的布局中,然后显示主窗口。 需要注意的是,Ribbon菜单是一个相对较新的控件,并且在不同的平台上可能有不同的外观和行为。因此,在自定义Ribbon菜单时,需要仔细测试和调整以确保在不同平台上都有良好的用户体验。 希望以上回答能对您有所帮助。 ### 回答2: Qt是一个跨平台的C++开发框架,提供了丰富的功能和工具,可以用于开发桌面应用程序。自定义Ribbon菜单是其中的一个功能。 Ribbon菜单是一种常见的用户界面设计元素,它通常用于快速访问常用的功能和工具。Qt提供了QtitanRibbon插件,可以方便地实现自定义的Ribbon菜单。 要自定义Ribbon菜单,首先需要安装QtitanRibbon插件。安装完成后,可以在Qt Designer中添加Ribbon控件,并根据需要调整其外观和行为。可以设置菜单的布局、样式、颜色等属性,并添加自定义的按钮和选项。 在代码中,可以使用QtitanRibbon提供的API来处理Ribbon菜单的事件和用户交互。可以定义槽函数来响应按钮的点击、选项的选择等操作。通过槽函数,可以实现具体的功能逻辑,例如打开文件、保存数据等操作。 除了使用QtitanRibbon插件,也可以使用Qt自带的工具和功能来实现自定义的Ribbon菜单。可以使用QToolBar、QAction等类来创建菜单的控件和按钮,并使用信号和槽机制来处理用户的交互。可以自定义菜单的布局、样式和行为,并根据需要添加自定义的功能和工具。 总之,通过使用Qt提供的功能和工具,可以方便地实现自定义的Ribbon菜单。无论是使用QtitanRibbon插件还是Qt自带的功能,都可以根据需求来设计和实现用户友好的Ribbon菜单界面。 ### 回答3: 在Qt中自定义Ribbon菜单可以通过以下步骤实现: 1. 创建一个新的Qt应用程序项目并打开你想要添加自定义Ribbon菜单的主窗口。 2. 在主窗口中添加一个QMainWindow和一个QMenuBar。 3. 创建一个新的QWidget,作为Ribbon菜单的容器。 4. 将QWidget设置为QMainWindow的centralWidget(),以便显示Ribbon菜单。 5. 使用QVBoxLayout或其他布局管理器,将Ribbon菜单中的各个功能区或选项分组逐个添加到QWidget中。 6. 为每个功能区创建一个QGroupBox,并使用QGridLayout或其他布局管理器在功能区中添加需要的控件和操作。 7. 根据需要向每个功能区中添加按钮、复选框、下拉列表等控件,并为它们添加相应的槽函数或信号连接。 8. 在主窗口的菜单栏中添加一个“Ribbon”选项,用于显示/隐藏Ribbon菜单。 9. 在“Ribbon”选项的槽函数中,通过QWidget的setVisible()函数来显示或隐藏Ribbon菜单。 10. 运行程序,你将看到自定义的Ribbon菜单在主窗口中显示,并且可以与其中的控件进行交互。 需要注意的是,Qt并没有提供内置的Ribbon菜单控件,因此我们需要自己创建一个类似于Ribbon菜单的容器,并在其中添加各种控件和操作。此外,可以根据自己的需求和设计风格来自定义Ribbon菜单的样式和布局。 希望以上回答能对你有所帮助。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值