基于QAction和事件过滤器的软件主界面设计

2024-02-23 11:32

本文主要是介绍基于QAction和事件过滤器的软件主界面设计,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

先看一下效果图。
功能说明:1.因为使用了布局管理器,故下方白色区域(tabwidget)可随窗体大小自动充满。
2.依次点击五个图标(主页、查询、设置、用户、退出),可切换白色区域显示内容(其实是切换到tabwidget不同的索引页),每个索引页的UI可在Form中进行可视化设计。

代码如下:

一、KS.pro(默认配置,无须编写),我的工程取名为KS

#-------------------------------------------------
#
# Project created by QtCreator 2019-11-03T00:00:46
#
#-------------------------------------------------QT       += core guigreaterThan(QT_MAJOR_VERSION, 4): QT += widgetsTARGET = KS
TEMPLATE = app# The following define makes your compiler emit warnings if you use
# any feature of Qt which as been marked as deprecated (the exact warnings
# depend on your compiler). Please consult the documentation of the
# deprecated API in order to know how to port your code away from it.
DEFINES += QT_DEPRECATED_WARNINGS# You can also make your code fail to compile if you use deprecated APIs.
# In order to do so, uncomment the following line.
# You can also select to disable deprecated APIs only up to a certain version of Qt.
#DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0x060000    # disables all the APIs deprecated before Qt 6.0.0
SOURCES += \main.cpp \mainwindow.cpp
HEADERS += \mainwindow.h \includes.h
FORMS += \mainwindow.ui

二、main.cpp(也是默认配置)

#include "mainwindow.h"
#include <QApplication>int main(int argc, char *argv[])
{QApplication a(argc, argv);MainWindow w;w.show();return a.exec();
}

三、includes.h

#ifndef INCLUDES_H
#define INCLUDES_H#include <QMainWindow>
#include <QDebug>
#include <QDialog>
#include <QAction>
#include <QMessageBox>
#include <QCoreApplication>
#include <QEvent>
#include <QImage>
#include <QPixmap>
#include <QStatusBar>
#include <QMouseEvent>
#include <QGridLayout>
#include <QVBoxLayout>#endif // INCLUDES_H

四、 mainwindow.h

#ifndef MAINWINDOW_H
#define MAINWINDOW_H#include <QMainWindow>
#include "includes.h"namespace Ui {
class MainWindow;
}class MainWindow : public QMainWindow
{Q_OBJECTQAction *Action_MainForm;QAction *Action_Inquire;QAction *Action_Settings;QAction *Action_Users;QAction *Action_Quit;void InstallEventFilter();void UI_Init();public:explicit MainWindow(QWidget *parent = 0);~MainWindow();private:Ui::MainWindow *ui;protected:bool eventFilter(QObject *obj, QEvent *event);public slots:};#endif // MAINWINDOW_H

五、mainwindow.cpp

#include "mainwindow.h"
#include "ui_mainwindow.h"MainWindow::MainWindow(QWidget *parent) :QMainWindow(parent),ui(new Ui::MainWindow)
{ui->setupUi(this);UI_Init();InstallEventFilter();
}MainWindow::~MainWindow()
{delete ui;
}void MainWindow::UI_Init()
{this->resize(1100,700);this->setWindowTitle("监控软件");setWindowFlags(Qt::WindowCloseButtonHint | Qt::WindowMinMaxButtonsHint);QVBoxLayout* layout = new QVBoxLayout();  //创建一个layout对象ui->tabWidget->setSizePolicy(QSizePolicy::Expanding,QSizePolicy::Expanding);  //设置tabWidget的尺寸策略ui->tabWidget->findChildren<QTabBar*>().at(0)->hide();  //隐藏tabwidget表头layout->addWidget(ui->tabWidget);  //将tabwidget添加到布局layoutQWidget* widget = new QWidget(this);  //新建一个widgetwidget->setLayout(layout);  //将layout添加到widget区域中this->setCentralWidget(widget);//将widget设置为中心窗口int maintoolbar_size=54;ui->mainToolBar->setFixedHeight(maintoolbar_size);ui->mainToolBar->setIconSize(QSize(maintoolbar_size,maintoolbar_size));QPixmap *pixmap_logo_long=new QPixmap("./resources/logo_long.jpg");QPixmap p_logo_long=pixmap_logo_long->scaled(270,50,Qt::KeepAspectRatio);QPixmap *pixmap_home=new QPixmap("./resources/home.jpg");QPixmap p_home=pixmap_home->scaled(maintoolbar_size,maintoolbar_size,Qt::KeepAspectRatio);QPixmap *pixmap_inquire=new QPixmap("./resources/inquire.jpg");QPixmap p_inquire=pixmap_inquire->scaled(maintoolbar_size,maintoolbar_size,Qt::KeepAspectRatio);QPixmap *pixmap_settings=new QPixmap("./resources/settings.jpg");QPixmap p_settings=pixmap_settings->scaled(maintoolbar_size,maintoolbar_size,Qt::KeepAspectRatio);    QPixmap *pixmap_human=new QPixmap("./resources/human.jpg");QPixmap p_human=pixmap_human->scaled(maintoolbar_size,maintoolbar_size,Qt::KeepAspectRatio);QPixmap *pixmap_quit=new QPixmap("./resources/quit.jpg");QPixmap p_quit=pixmap_quit->scaled(maintoolbar_size,maintoolbar_size,Qt::KeepAspectRatio);//创建ActionQWidget* blankwidget; int spacesize=30;QWidget* logowidget = new QWidget(this); logowidget->setFixedSize(270,50);QLabel* label_longlogo=new QLabel(logowidget);label_longlogo->setFixedSize(270,50);label_longlogo->setPixmap(p_logo_long);ui->mainToolBar->addWidget(logowidget);QWidget* spacer = new QWidget();spacer->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding);ui->mainToolBar->addWidget(spacer);Action_MainForm = new QAction(QIcon(p_home), tr("&主界面"), this);Action_MainForm->setShortcut(tr("Ctrl+1"));Action_MainForm->setStatusTip(tr("Main interface"));ui->mainToolBar->addAction(Action_MainForm);blankwidget = new QWidget(this);  //新建一个widgetblankwidget->setFixedSize(spacesize,maintoolbar_size);ui->mainToolBar->addWidget(blankwidget);Action_Inquire = new QAction(QIcon(p_inquire), tr("&查询"), this);Action_Inquire->setShortcut(tr("Ctrl+2"));Action_Inquire->setStatusTip(tr("Inquire"));ui->mainToolBar->addAction(Action_Inquire);blankwidget = new QWidget(this);  //新建一个widgetblankwidget->setFixedSize(spacesize,maintoolbar_size);ui->mainToolBar->addWidget(blankwidget);Action_Settings = new QAction(QIcon(p_settings), tr("&设置"), this);Action_Settings->setShortcut(tr("Ctrl+3"));Action_Settings->setStatusTip(tr("Settings"));ui->mainToolBar->addAction(Action_Settings);blankwidget = new QWidget(this);  //新建一个widgetblankwidget->setFixedSize(spacesize,maintoolbar_size);ui->mainToolBar->addWidget(blankwidget);Action_Users = new QAction(QIcon(p_human), tr("&用户"), this);Action_Users ->setShortcut(tr("Ctrl+4"));Action_Users ->setStatusTip(tr("User Management"));ui->mainToolBar->addAction(Action_Users);blankwidget = new QWidget(this);  //新建一个widgetblankwidget->setFixedSize(spacesize,maintoolbar_size);ui->mainToolBar->addWidget(blankwidget);Action_Quit = new QAction(QIcon(p_quit), tr("&退出"), this);Action_Quit->setShortcut(tr("Ctrl+5"));Action_Quit->setStatusTip(tr("Quit"));ui->mainToolBar->addAction(Action_Quit);blankwidget = new QWidget(this);  //新建一个widgetblankwidget->setFixedSize(spacesize,maintoolbar_size);ui->mainToolBar->addWidget(blankwidget);for(int i=0;i<ui->tabWidget->tabBar()->count();i++){ui->tabWidget->setTabEnabled(i,false);}ui->tabWidget->setTabEnabled(0,true);ui->tabWidget->setCurrentIndex(0);}//注册事件过滤器
void MainWindow::InstallEventFilter()
{Action_MainForm->setCheckable(true);Action_Inquire->setCheckable(true);Action_Settings->setCheckable(true);Action_Users->setCheckable(true);Action_Quit->setCheckable(true);Action_MainForm->installEventFilter(this);Action_Inquire->installEventFilter(this);Action_Settings->installEventFilter(this);Action_Users->installEventFilter(this);Action_Quit->installEventFilter(this);
}//事件过滤器
bool MainWindow::eventFilter(QObject *obj, QEvent *event)
{if(event->type()==QEvent::ActionChanged){if(obj==Action_MainForm&&Action_MainForm->isChecked()==true){qDebug()<<"1   Action_MainForm";if(Action_Inquire->isChecked())Action_Inquire->setChecked(false);if(Action_Settings->isChecked())Action_Settings->setChecked(false);if(Action_Users->isChecked())Action_Users->setChecked(false);if(Action_Quit->isChecked())Action_Quit->setChecked(false);           ui->tabWidget->setCurrentIndex(0);}else if(obj==Action_Inquire&&Action_Inquire->isChecked()==true){qDebug()<<"2   Action_Inquire";if(Action_MainForm->isChecked())Action_MainForm->setChecked(false);if(Action_Settings->isChecked())Action_Settings->setChecked(false);if(Action_Users->isChecked())Action_Users->setChecked(false);if(Action_Quit->isChecked())Action_Quit->setChecked(false);ui->tabWidget->setCurrentIndex(1);}else if(obj==Action_Settings&&Action_Settings->isChecked()==true){qDebug()<<"3   Action_Settings";if(Action_MainForm->isChecked())Action_MainForm->setChecked(false);if(Action_Inquire->isChecked())Action_Inquire->setChecked(false);if(Action_Users->isChecked())Action_Users->setChecked(false);if(Action_Quit->isChecked())Action_Quit->setChecked(false);ui->tabWidget->setCurrentIndex(2);}else if(obj==Action_Users&&Action_Users->isChecked()==true){qDebug()<<"4   Action_Users";if(Action_MainForm->isChecked())Action_MainForm->setChecked(false);if(Action_Inquire->isChecked())Action_Inquire->setChecked(false);if(Action_Settings->isChecked())Action_Settings->setChecked(false);if(Action_Quit->isChecked())Action_Quit->setChecked(false);ui->tabWidget->setCurrentIndex(3);}else if(obj==Action_Quit&&Action_Quit->isChecked()==true){qDebug()<<"5   Action_Quit";if(Action_MainForm->isChecked())Action_MainForm->setChecked(false);if(Action_Inquire->isChecked())Action_Inquire->setChecked(false);if(Action_Settings->isChecked())Action_Settings->setChecked(false);if(Action_Users->isChecked())Action_Users->setChecked(false);ui->tabWidget->setCurrentIndex(4);}else{;}//如果想让五个图标点击后不自动弹起,请注释掉接下来的五行代码Action_MainForm->setChecked(false);Action_Inquire->setChecked(false);Action_Settings->setChecked(false);Action_Users->setChecked(false);Action_Quit->setChecked(false);}//eventFilter实现的最后必须调用watcher基类的eventFilter函数以传递事件,否则obj的所有事件都将丢失return QObject::eventFilter(obj,event);
}

后记:
1.使用事件过滤器无法判别QAction的按下或抬起,所以造成代码量有些复杂。如果改用信号槽机制,将每个Action的triggered信号连接到相应的槽进行处理,也是一种思路,代码量也相差无几。
2.本次示例没有建立菜单栏中的菜单项,也没有将Action添加到菜单中,因为对于简单的项目,会显得有些冗余,读者也可自己编写,将这五个Action添加到菜单中。
期待一起进步,也祝我接下来几天玩的愉快哈哈~

这篇关于基于QAction和事件过滤器的软件主界面设计的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/738487

相关文章

Servlet中配置和使用过滤器的步骤记录

《Servlet中配置和使用过滤器的步骤记录》:本文主要介绍在Servlet中配置和使用过滤器的方法,包括创建过滤器类、配置过滤器以及在Web应用中使用过滤器等步骤,文中通过代码介绍的非常详细,需... 目录创建过滤器类配置过滤器使用过滤器总结在Servlet中配置和使用过滤器主要包括创建过滤器类、配置过滤

Ubuntu 怎么启用 Universe 和 Multiverse 软件源?

《Ubuntu怎么启用Universe和Multiverse软件源?》在Ubuntu中,软件源是用于获取和安装软件的服务器,通过设置和管理软件源,您可以确保系统能够从可靠的来源获取最新的软件... Ubuntu 是一款广受认可且声誉良好的开源操作系统,允许用户通过其庞大的软件包来定制和增强计算体验。这些软件

Python中的异步:async 和 await以及操作中的事件循环、回调和异常

《Python中的异步:async和await以及操作中的事件循环、回调和异常》在现代编程中,异步操作在处理I/O密集型任务时,可以显著提高程序的性能和响应速度,Python提供了asyn... 目录引言什么是异步操作?python 中的异步编程基础async 和 await 关键字asyncio 模块理论

禁止平板,iPad长按弹出默认菜单事件

通过监控按下抬起时间差来禁止弹出事件,把以下代码写在要禁止的页面的页面加载事件里面即可     var date;document.addEventListener('touchstart', event => {date = new Date().getTime();});document.addEventListener('touchend', event => {if (new

软件设计师备考——计算机系统

学习内容源自「软件设计师」 上午题 #1 计算机系统_哔哩哔哩_bilibili 目录 1.1.1 计算机系统硬件基本组成 1.1.2 中央处理单元 1.CPU 的功能 1)运算器 2)控制器 RISC && CISC 流水线控制 存储器  Cache 中断 输入输出IO控制方式 程序查询方式 中断驱动方式 直接存储器方式(DMA)  ​编辑 总线 ​编辑

【STM32】SPI通信-软件与硬件读写SPI

SPI通信-软件与硬件读写SPI 软件SPI一、SPI通信协议1、SPI通信2、硬件电路3、移位示意图4、SPI时序基本单元(1)开始通信和结束通信(2)模式0---用的最多(3)模式1(4)模式2(5)模式3 5、SPI时序(1)写使能(2)指定地址写(3)指定地址读 二、W25Q64模块介绍1、W25Q64简介2、硬件电路3、W25Q64框图4、Flash操作注意事项软件SPI读写W2

免费也能高质量!2024年免费录屏软件深度对比评测

我公司因为客户覆盖面广的原因经常会开远程会议,有时候说的内容比较广需要引用多份的数据,我记录起来有一定难度,所以一般都用录屏工具来记录会议内容。这次我们来一起探索有什么免费录屏工具可以提高我们的工作效率吧。 1.福晰录屏大师 链接直达:https://www.foxitsoftware.cn/REC/  录屏软件录屏功能就是本职,这款录屏工具在录屏模式上提供了多种选项,可以选择屏幕录制、窗口

HomeBank:开源免费的个人财务管理软件

在个人财务管理领域,找到一个既免费又开源的解决方案并非易事。HomeBank&nbsp;正是这样一个项目,它不仅提供了强大的功能,还拥有一个活跃的社区,不断推动其发展和完善。 开源免费:HomeBank 是一个完全开源的项目,用户可以自由地使用、修改和分发。用户友好的界面:提供直观的图形用户界面,使得非技术用户也能轻松上手。数据导入支持:支持从 Quicken、Microsoft Money

PDF 软件如何帮助您编辑、转换和保护文件。

如何找到最好的 PDF 编辑器。 无论您是在为您的企业寻找更高效的 PDF 解决方案,还是尝试组织和编辑主文档,PDF 编辑器都可以在一个地方提供您需要的所有工具。市面上有很多 PDF 编辑器 — 在决定哪个最适合您时,请考虑这些因素。 1. 确定您的 PDF 文档软件需求。 不同的 PDF 文档软件程序可以具有不同的功能,因此在决定哪个是最适合您的 PDF 软件之前,请花点时间评估您的

Redis中使用布隆过滤器解决缓存穿透问题

一、缓存穿透(失效)问题 缓存穿透是指查询一个一定不存在的数据,由于缓存中没有命中,会去数据库中查询,而数据库中也没有该数据,并且每次查询都不会命中缓存,从而每次请求都直接打到了数据库上,这会给数据库带来巨大压力。 二、布隆过滤器原理 布隆过滤器(Bloom Filter)是一种空间效率很高的随机数据结构,它利用多个不同的哈希函数将一个元素映射到一个位数组中的多个位置,并将这些位置的值置