一、实现功能:
1、显示图标+文字,上下两排显示
2、取消前面竖排的小圆点
3、点击菜单栏就切换窗口
二、实现结果:
三、实现过程:
3.1、前言
最开始说菜单栏,首先想到的就是QMenu,打算用connect连接SIGNAL(triggered())和SLOT(XXX),结果运行程序出现如下错误:
QObject::connect: No such signal QMenu::triggered()
后发现有博客说这样是行不通的,因为QMenu相当于是一个Label的作用,并不能执行任何的操作,要么就QMenu下添加一个QAction来实现。
3.2、QToolBar实现步骤
于是乎转念一想,可以使用QToolBar实现:
3.2.1、添加工具栏
3.2.2、工具栏新建动作
3.2.3、添加图标资源
添加图标之前,我们得先添加资源:(步骤截图)
3.2.4、工具栏添加图标
3.2.5、图标+文本,取消竖排小圆点,修改图标大小,修改文本样式
这些均在QToolBar的属性栏中修改
3.3、实现切换窗口
3.3.1、新建窗体对象
新建的mainform.ui就可以创建我们想要的内容了
3.3.2、 编码
mainwindow.h:
#ifndef MAINWINDOW_H
#define MAINWINDOW_H
#include <QMainWindow>
//引入窗体头文件
#include "mainform.h"
#include "monitorform.h"
#include "navigationform.h"
namespace Ui {
class MainWindow;
}
class MainWindow : public QMainWindow
{
Q_OBJECT
public:
explicit MainWindow(QWidget *parent = 0);
~MainWindow();
private:
Ui::MainWindow *ui;
public:
int AppWidth; // 屏宽
int AppHeight; // 屏高
MainForm* mainForm; //主界面窗体对象
NavigationForm* navigationForm; //导航窗体对象
MonitorForm* monitorForm; //监控窗体对象
void CreateNewForms(); //创建窗体
void ShowForms(quint8 mIdx); //展示窗体
private slots:
//动作触发槽函数
void on_mainaction_triggered();
void on_monitoraction_triggered();
void on_navigationaction_triggered();
};
#endif // MAINWINDOW_H
mainwindow.cpp:
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QDesktopWidget>
static uint oldFormIdx=0;//记录当前界面下标
MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MainWindow)
{
ui->setupUi(this);
//取消窗体的最大化、最小化、托盘管理
Qt::WindowFlags flag=0;
flag=Qt::Window|Qt::WindowCloseButtonHint|Qt::MSWindowsFixedSizeDialogHint;
flag&=~Qt::WindowContextHelpButtonHint;
flag&=~Qt::WindowMinMaxButtonsHint;
setWindowFlags(flag);
//实现窗口固定最大化
QDesktopWidget* desk=QApplication::desktop(); //获取桌面控件
QRect rect=desk->screenGeometry(); //获取可用桌面大小
AppWidth=rect.width(); //取得屏幕桌面宽
AppHeight=rect.height(); //取得屏幕桌面高
resize(AppWidth,AppHeight);
setFixedSize(AppWidth,AppHeight); //设置固定窗口大小
move(-2,0); //移动窗口位置
this->setWindowTitle("ROV"); //窗口名称
this->setContextMenuPolicy(Qt::NoContextMenu); //设置右健菜单,五个枚举:Qt::NoContextMenu(小部件没有上下文菜单,上下文菜单的处理被推迟到小部件的父级)
//设置背景颜色
QPalette palette(this->palette()); //QPalette是Qt中的调色板类,它提供的setColor()函数可改变控件的颜色
palette.setColor(QPalette::Background,QColor(175,175,175));
this->setPalette(palette);
CreateNewForms();
ShowForms(0);
}
void MainWindow::CreateNewForms()
{
mainForm= new MainForm(this); //创建窗体指针对象
mainForm->setAttribute(Qt::WA_DeleteOnClose); //widget将会被释放。不管widget是否可见,关闭事件都会传递给widget。
//即接收到QCloseEvent事件后,除了调用hide()方法将窗口隐藏,同时会调用deleteLater()方法将窗口释放掉,不会再占用资源。
mainForm->resize(1440,920); //窗口大小
mainForm->move(10,40); //窗口位置
navigationForm= new NavigationForm(this);
navigationForm->setAttribute(Qt::WA_DeleteOnClose);
navigationForm->resize(1440,920);
navigationForm->move(10,40);
monitorForm= new MonitorForm(this);
monitorForm->setAttribute(Qt::WA_DeleteOnClose);
monitorForm->resize(1440,920);
monitorForm->move(10,40);
this->monitorForm->hide(); //隐藏窗体
this->navigationForm->hide(); //隐藏窗体
}
void MainWindow::ShowForms(quint8 mIdx)
{
if(oldFormIdx!=mIdx)
{
switch(mIdx)
{
case 0:
mainForm->show();
break;
case 1:
monitorForm->show();
break;
case 2:
navigationForm->show();
break;
}
switch(oldFormIdx)
{
case 0:
mainForm->hide();
break;
case 1:
monitorForm->hide();
break;
case 2:
navigationForm->hide();
break;
}
oldFormIdx=mIdx;
}
}
//槽函数
void MainWindow::on_mainaction_triggered()
{
ShowForms(0);
}
void MainWindow::on_monitoraction_triggered()
{
ShowForms(1);
}
void MainWindow::on_navigationaction_triggered()
{
ShowForms(2);
}
MainWindow::~MainWindow()
{
delete mainForm;
delete monitorForm;
delete navigationForm;
delete ui;
}
四、我的源码
链接:https://pan.baidu.com/s/1Otd-Y_AEsIadZza005ZeKA?pwd=qe9k
提取码:qe9k