4.3 自定义菜单栏
在上一节中,小豆君跟大家分享了标准的菜单栏,但是对于现今的用户体验要求的不断提高,很难满足用户的新的需求,所以需要我们来设计操作简单,样式漂亮的自定义菜单栏,所以小豆君今天来演示如何使用Qt制作自定义菜单栏。
自定义菜单栏,关键要用到一个类为QWidgetAction,它继承于QAction,使用setDefaultWidget接口将自定义窗口放到QWidgetAction中,然后再像添加QAction一样,将QWidgetAction添加到QMenu中就可以了。
下面我们来制作一个类似于Word中的文字颜色菜单栏,我这里只是简单的写一下,主要是为了演示如何制作自定义菜单栏。
4.3.1 示例代码
在上一节的代码中,继续添加一个ui界面类SelectColorWidget,这个类用来作为我们需要的自定义窗口,它是一个颜色选择框,如上图。
selectcolorwidget.h
#ifndef SELECTCOLORWIDGET_H
#define SELECTCOLORWIDGET_H
#include <QWidget>
namespace Ui {
class SelectColorWidget;
}
class QButtonGroup;
class SelectColorWidget : public QWidget
{
Q_OBJECT
public:
explicit SelectColorWidget(QWidget *parent = 0);
~SelectColorWidget();
signals:
void clrButtonClicked(const QColor& clr);
private:
Ui::SelectColorWidget *ui;
QButtonGroup* m_btnGroup;
};
#endif // SELECTCOLORWIDGET_H
selectcolorwidget.cpp
#include <QPushButton>
#include <QButtonGroup>
#include "selectcolorwidget.h"
#include "ui_selectcolorwidget.h"
SelectColorWidget::SelectColorWidget(QWidget *parent) :
QWidget(parent),
ui(new Ui::SelectColorWidget)
{
ui->setupUi(this);
m_btnGroup = new QButtonGroup(this);
//创建一个4*4的颜色选择表,这里用了Qt中预定义的颜色
for (int i = 0; i < Qt::transparent-3; ++i)
{
int col = i % 4;
int row = i/4;
QPushButton * btn = new QPushButton;
QColor clr = (Qt::GlobalColor)(i+2);
btn->setStyleSheet(QString("background-color:%1").arg(clr.name()));
ui->gridLayout->addWidget(btn, row, col);
m_btnGroup->addButton(btn, i+2);
}
connect(m_btnGroup, static_cast<void(QButtonGroup::*)(int)>(&QButtonGroup::buttonClicked),
[=](int index)
{
QColor clr = (Qt::GlobalColor)index;
emit clrButtonClicked(clr);
});
}
SelectColorWidget::~SelectColorWidget()
{
delete ui;
}
再在原MainWindowMenu类中添加如下代码
mainwindowmenu.h
private slots:
void setTextColor(const QColor& clr);//用于设置textedit中的文本颜色
private:
void createTextColorMenu();//用于创建自定义颜色窗口
private:
QMenu* m_menuColor;//颜色菜单栏
在定义中添加如下接口函数,并且在构造函数中调用createTextColorMenu()
mainwindowmenu.cpp
void MainWindowMenu::setTextColor(const QColor &clr)
{
QPalette palette = ui->textEdit->palette();
palette.setColor(QPalette::Text, clr);
ui->textEdit->setPalette(palette);
m_menuColor->close();
}
void MainWindowMenu::createTextColorMenu()
{
SelectColorWidget* wgt = new SelectColorWidget;
m_menuColor = new QMenu("文字颜色");
//这个QWidgetAction可以将我们自定义的窗口加入到菜单栏中
QWidgetAction* act = new QWidgetAction(m_menuColor);
act->setDefaultWidget(wgt);
connect(wgt, SIGNAL(clrButtonClicked(QColor)),
this, SLOT(setTextColor(QColor)));
m_menuColor->addAction(act);
menuBar()->addMenu(m_menuColor);
}
编译运行程序,选择不同的颜色,文本框中的文字就会改变成该颜色。
学会了自定义菜单栏,你就可以按照你设计,将更多好看美观的窗口加入到菜单栏中,就像word中的各式菜单栏一样,你的程序也一定会变得更棒。
最后,经群里的朋友提醒,还请大家注意,如果自定义的颜色窗口没有弹出来,而是只弹出一个小小的框,是因为你的顶层窗口没有设置布局。具体做法是,在ui设计师界面选择最外层窗口,为该窗口添加一个任意布局即可。
如果你想要获得更多干货,请关注我的微信公众号:小豆君,只要关注,便可加入小豆君为大家创建的C++\Qt交流群,方便讨论学习。
《Qt 全流程实战企业级项目 - 云对象存储浏览器》视频实战教程,点击链接开始学习吧!