最初视频监控系统按照二级菜单的设计思路,顶部标题栏一级菜单,左侧对应二级菜单,最初采用图片在上面,文字在下面的按钮方式展示,随着功能的增加,二级菜单越来越多,如果都是这个图文上下排列的按钮,那左侧高度空间不够,比如在笔记本1366x768的分辨率上,左侧如果有七八个菜单按钮,那就摆不下了,会把界面撑大导致有些界面看不到,在一整个屏幕上看不全,所以才想着把导航菜单设计成了动态展示的方案,根据菜单的名字,自动生成对应的菜单按钮,图片位置可选是在上面还是在左侧,所以产生了四种菜单排列组合,上侧+上侧,上侧+左侧,左侧+上侧,左侧+左侧,可以由用户自己在系统设置中切换即可。
void frmMain::initNav()
{
QList<QString> names, texts;
names << "btnView" << "btnVideo" << "btnMap" << "btnMain1" << "btnData" << "btnConfig";
texts << "视频监控" << "视频回放" << "电子地图" << AppData::TitleMain1 << "日志查询" << "系统设置";
icons << 0xe68c << 0xe68d << 0xe695 << AppData::IconMain1 << 0xe699 << 0xe706;
//根据设定实例化导航按钮对象
for (int i = 0; i < texts.count(); ++i) {
QToolButton *btn = new QToolButton;
CommonNav::initNavBtn(btn, names.at(i), texts.at(i), false);
connect(btn, SIGNAL(clicked(bool)), this, SLOT(buttonClicked()));
ui->layoutNav->addWidget(btn);
btns << btn;
}
}
void CommonNav::initNavLayout(QWidget *widget, QLayout *layout, bool left)
{
//不同的样式边距和图标大小不一样,可以自行调整对应值看效果
int topMargin, otherMargin;
if (left) {
} else {
if (CommonNav::NavMainLeft) {
topMargin = widget->height() + 6;
otherMargin = 9;
} else {
topMargin = 3;
otherMargin = 3;
}
}
layout->setContentsMargins(otherMargin, topMargin, otherMargin, otherMargin);
}
void CommonNav::initNavBtn(QToolButton *btn, const QString &name, const QString &text, bool left)
{
btn->setObjectName(name);
btn->setText(text);
btn->setCheckable(true);
//顶部导航和左侧导航拉伸策略不一样
if (left) {
btn->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Preferred);
if (CommonNav::NavSubLeft) {
btn->setToolButtonStyle(Qt::ToolButtonTextBesideIcon);
btn->setMinimumHeight(30);
} else {
btn->setToolButtonStyle(Qt::ToolButtonTextUnderIcon);
btn->setMinimumHeight(80);
}
} else {
btn->setSizePolicy(QSizePolicy::Preferred, QSizePolicy::Expanding);
if (CommonNav::NavMainLeft) {
btn->setToolButtonStyle(Qt::ToolButtonTextBesideIcon);
btn->setMinimumWidth(115);
} else {
btn->setToolButtonStyle(Qt::ToolButtonTextUnderIcon);
btn->setMinimumWidth(80);
}
}
}
void CommonNav::initNavBtnIcon(QAbstractButton *btn, int icon, bool left, int offset)
{
//可以自行调整尺寸
int size = 20;
int width = 25;
int height = 20;
//根据不同的图标位置设置不同的图标尺寸
if (left) {
if (!CommonNav::NavSubLeft) {
size = 35;
width = 40;
height = 35;
}
} else {
if (!CommonNav::NavMainLeft) {
size = 35;
width = 40;
height = 35;
}
}
//偏移值 可能部分图标要调整大小
size += offset;
setIconBtn(btn, icon, size, width, height);
}
void CommonNav::setIconBtn(QAbstractButton *btn, int icon)
{
//可以自行调整尺寸
int size = 16;
int width = 18;
int height = 18;
setIconBtn(btn, icon, size, width, height);
}
void CommonNav::setIconBtn(QAbstractButton *btn, int icon, int size, int width, int height, int fontSize)
{
//取出正常状态和禁用状态图片
QPixmap pixNormal = IconHelper::getPixmap(QUIConfig::TextColor, icon, size, width, height);
QPixmap pixDisabled = IconHelper::getPixmap(QUIConfig::BorderColor, icon, size, width, height);
QIcon ico(pixNormal);
ico.addPixmap(pixDisabled, QIcon::Disabled, QIcon::On);
ico.addPixmap(pixDisabled, QIcon::Disabled, QIcon::Off);
btn->setIconSize(QSize(width, height));
btn->setIcon(ico);
if (fontSize > 0) {
QFont font;
font.setPixelSize(fontSize);
btn->setFont(font);
}
}