QT记事本+登陆界面的简单实现

news2024/11/26 1:50:02

主体头文件

#ifndef JSB_H
#define JSB_H

#include <QMainWindow>
#include <QMenuBar>//菜单栏
#include <QToolBar>//工具栏
#include <QStatusBar>//状态栏
#include <QTextEdit>//文本
#include <QLabel>//标签
#include <QDebug>//打印
#include <QDateTime>//获取当前时间
#include <QDesktopServices>//桌面服务
#include <QUrl>//资源定位
#include "ipv.h"
#include <QFileDialog>//文件对话框
#include <QColorDialog>//颜色对话框
#include <QFontDialog>//字体对话框
#include <QTextStream>//文本流
#include <QMessageBox>
#include <QCloseEvent>
#include <QDebug>
class JSB : public QMainWindow
{
    Q_OBJECT

public:
    JSB(QWidget *parent = nullptr);
    ~JSB();

public slots:
    void open_slot();
    void new_slot();
    void save_slot();
    void exit_slot();

    void copy_slot();
    void patse_slot();
    void cut_slot();
    void redo_slot();
    void undo_slot();

    void time_slot();

    void color_slot();
    void font_slot();

    void about_slot();
    void web_slot();
    void ipv_slot();


   void closeEvent(QCloseEvent *event);

private:
    //菜单栏
    QMenuBar * bar=NULL;
    //文件菜单
    QMenu *File = NULL;
    //打开
    QAction *Open = NULL;
    //新建
    QAction *New = NULL;
    //保存
    QAction *Save = NULL;
    //退出
    QAction *Exit = NULL;

    //编辑菜单
    QMenu *Edit = NULL;
    //恢复
    QAction *Redo = NULL;
    //撤销
    QAction *Undo = NULL;
    //复制
    QAction *Copy = NULL;
    //粘贴
    QAction *Patse = NULL;
    //剪切
    QAction *Cut = NULL;

    //工具菜单
    QMenu * Tool = NULL;
    //时间
    QAction *Time = NULL;

    //格式菜单
    QMenu * ForMat = NULL;
    //颜色
    QAction *Color = NULL;
    //字体
    QAction *Font = NULL;

    //帮助
    QMenu *Help = NULL;
    //关于
    QAction *About = NULL;
    //官网
    QAction *Web = NULL;
    //版本
    QAction *IPv = NULL;

    //工具栏
    QToolBar *ToolBar = NULL;
    //状态栏
    QStatusBar *staBar = NULL;


    //文本
    QTextEdit *edit = NULL;


};
#endif // JSB_H

主体的函数实现

#include "jsb.h"

JSB::JSB(QWidget *parent)
    : QMainWindow(parent)
{
    //设置窗口大小
    this->resize(600,600);
    //设置窗口文本
    this->setWindowTitle("记事本");
    //设置窗口图标
    this->setWindowIcon(QIcon(":/image/Jsb.png"));

    //初始化菜单
    this->bar = menuBar();
    //指定父类
    bar->setParent(this);
    //将菜单栏放入到窗口
    setMenuBar(bar);
    //创建文件菜单
    this->File = bar->addMenu("文件(&F)");
    //菜单项
    this->New = File->addAction("新建");
    //快捷键
    this->New->setShortcut(tr("Ctrl+N"));
    //分隔符
    this->File->addSeparator();
    //新建图标
    this->New->setIcon(QIcon(":/image/New.png"));
    connect(New,&QAction::triggered,this,&JSB::new_slot);

    this->Open = File->addAction("打开");
    //打开快捷键
    this->Open->setShortcut(tr("Ctrl+O"));
    //图标
    this->Open->setIcon(QIcon(":/image/Open.png"));
    connect(Open,&QAction::triggered,this,&JSB::open_slot);


    this->Save = File->addAction("保存");
    this->Save->setShortcut(tr("Ctrl+S"));
    this->Save->setIcon(QIcon(":/image/Save.png"));
    connect(Save,&QAction::triggered,this,&JSB::save_slot);

    //分隔符
    this->File->addSeparator();
    this->Exit = File->addAction("退出");
    this->Exit->setShortcut(tr("Ctrl+Q"));
    this->Exit->setIcon(QIcon(":/image/Exit.png"));
    connect(Exit,&QAction::triggered,this,&JSB::exit_slot);


    //创建编辑菜单
    this->Edit = bar->addMenu("编辑(&E)");
    this->Redo = Edit->addAction("恢复");
    this->Redo->setShortcut(tr("Ctrl+R"));
    this->Redo->setIcon(QIcon(":/image/Redo.png"));
    connect(Redo,&QAction::triggered,this,&JSB::redo_slot);

    this->Undo = Edit->addAction("撤销");
    this->Undo->setShortcut(tr("Ctrl+U"));
    this->Undo->setIcon(QIcon(":/image/Undo.png"));
    //分隔符
    this->Edit->addSeparator();
    connect(Undo,&QAction::triggered,this,&JSB::undo_slot);

    this->Copy = Edit->addAction("复制");
    this->Copy->setShortcut(tr("Ctrl+C"));
    this->Copy->setIcon(QIcon(":/image/Copy.png"));
    connect(Copy,&QAction::triggered,this,&JSB::copy_slot);

    this->Patse = Edit->addAction("粘贴");
    this->Patse->setShortcut(tr("Ctrl+V"));
    this->Patse->setIcon(QIcon(":/image/Paste.png"));
    connect(Patse,&QAction::triggered,this,&JSB::patse_slot);

    this->Cut = Edit->addAction("剪切");
    this->Cut->setShortcut(tr("Ctrl+X"));
    this->Cut->setIcon(QIcon(":/image/Cut.png"));
    connect(Cut,&QAction::triggered,this,&JSB::cut_slot);
    //创建工具菜单
    this->Tool = bar->addMenu("工具(&T)");
    this->Time = Tool->addAction("时间");
    this->Time->setShortcut(tr("Ctrl+A"));
    this->Time->setIcon(QIcon(":/image/time.png"));
     connect(Time,&QAction::triggered,this,&JSB::time_slot);
    //创建格式菜单
    this->ForMat = bar->addMenu("格式(&M)");
    this->Color = ForMat->addAction("颜色");
    this->Color->setShortcut(tr("Ctrl+Alt+C"));
    this->Color->setIcon(QIcon(":/image/Color (5).png"));
    connect(Color,&QAction::triggered,this,&JSB::color_slot);

    this->Font = ForMat->addAction("字体");
    this->Font->setShortcut(tr("Ctrl+Alt+F"));
    this->Font->setIcon(QIcon(":/image/Font (2).png"));
    connect(Font,&QAction::triggered,this,&JSB::font_slot);

    //创建帮助菜单
    this->Help = bar->addMenu("帮助(&H)");
    this->About = Help->addAction("关于");
    this->About->setShortcut(tr("Ctrl+Shift+A"));
    this->About->setIcon(QIcon(":/image/About.png"));
    this->Web = Help->addAction("官网");
    this->Web->setShortcut(tr("Ctrl+Shift+W"));
    this->Web->setIcon(QIcon(":/image/web.png"));
    connect(Web,&QAction::triggered,this,&JSB::web_slot);

    this->IPv = Help->addAction("版本");
    this->IPv->setShortcut(tr("Ctrl+Shift+I"));
    this->IPv->setIcon(QIcon(":/image/Window.png"));
     connect(IPv,&QAction::triggered,this,&JSB::ipv_slot);
    //工具栏
    this->ToolBar = new QToolBar;
    this->ToolBar->setParent(this);
    addToolBar(ToolBar);
    this->ToolBar->setMovable(false);
    this->ToolBar->addAction(Open);
    this->ToolBar->addAction(Exit);

    this->ToolBar->addSeparator();
    this->ToolBar->addAction(Redo);
    this->ToolBar->addAction(Undo);

    this->ToolBar->addSeparator();
    this->ToolBar->addAction(Color);
    this->ToolBar->addAction(Font);

    this->ToolBar->addSeparator();
    this->ToolBar->addAction(Web);
    this->ToolBar->addAction(IPv);

    //状态栏
    this->staBar = statusBar();
    staBar->setParent(this);
    setStatusBar(staBar);

    //创建标签
    QLabel *label = new QLabel("UTF-8",this);

    staBar->addWidget(label);

    //文本
    this->edit = new QTextEdit(this);
    setCentralWidget(edit);

    //设置默认字体
    QFont font;
    font.setFamily("楷体");
    font.setPixelSize(20);
    font.setBold(true);
    this->edit->setFont(font);


    //设置默认颜色
    QColor color;
    color.setRed(100);

    this->edit->setTextColor(color);

}

JSB::~JSB()
{
}
 void JSB::closeEvent(QCloseEvent *event)
 {

     if(this->edit->document()->isModified())
     {
         QMessageBox msgBox;
         msgBox.setText("内容以改变.");
         msgBox.setInformativeText("是否保存新内容?");
         msgBox.setStandardButtons(QMessageBox::Save | QMessageBox::Discard | QMessageBox::Cancel);
         msgBox.setButtonText(QMessageBox::Save,"保存");
         msgBox.setButtonText(QMessageBox::Discard,"取消");
         msgBox.setButtonText(QMessageBox::Cancel,"不保存");
         msgBox.setDefaultButton(QMessageBox::Save);
        int ret = msgBox.exec();
         switch (ret) {
            case QMessageBox::Save:
                // Save was clicked
                this->save_slot();
                break;
            case QMessageBox::Discard:
                // Don't Save was clicked
                event->ignore();
                break;
            case QMessageBox::Cancel:
                // Cancel was clicked
                event->accept();
                break;
            default:
                // should never be reached
                break;
         }
   }
     else {
         event->accept();
     }
 }
void JSB::open_slot()
{
   QString filename = QFileDialog::getOpenFileName(
                this,"打开",".","*.*");

   QFile *file = new QFile;
   //设置打开的路径
   file->setFileName(filename);
   //只读
   bool ok = file->open(QIODevice::ReadOnly);

   if(ok)
   {
       //问件指针关联文本流
       QTextStream stream(file);
       //UTF-8
       stream.setCodec("UTF-8");
       this->edit->setText(stream.readAll());

       //关闭文件
       file->close();
       delete file;

       //获取当前光标的位置
       QTextCursor cursor = this->edit->textCursor();
       //将光标移动到末尾
       cursor.movePosition(QTextCursor::End);
       //将设置好的光标放到edit中
       this->edit->setTextCursor(cursor);
   }

}
void JSB::new_slot()
{
    JSB *w = new JSB;
    w->show();
    this->close();
}
void JSB::save_slot()
{
    QString filename = QFileDialog::getSaveFileName(
                 this,"保存",".","*.*");

    QFile *file = new QFile;
    //设置打开的路径
    file->setFileName(filename);
    //只写
    bool ok = file->open(QIODevice::WriteOnly);

    if(ok)
    {
        //文件指针关联文本流
        QTextStream stream(file);
        //UTF-8
        stream.setCodec("UTF-8");

        //QString str = this->edit->toPlainText();
         QString str = this->edit->toHtml();
        stream<<str;
        //关闭文件
        file->close();
        delete file;

        //清空edit
        this->edit->clear();
    }
}
void JSB::exit_slot()
{
    this->close();
}

void JSB::copy_slot()
{
    this->edit->copy();
}
void JSB::patse_slot()
{
    this->edit->paste();
}
void JSB::cut_slot()
{
    this->edit->cut();
}
void JSB::redo_slot()
{
    this->edit->redo();
}
void JSB::undo_slot()
{
    this->edit->undo();
}

void JSB::time_slot()
{
    QDateTime Time = QDateTime::currentDateTime();
    QString str = Time.toString("yyyy-MM-dd hh:mm:ss");

    this->edit->append(str);
}

void JSB::color_slot()
{
    QColor color = QColorDialog::getColor(Qt::red,this,"颜色");

    if(color.isValid())
    {
        this->edit->setTextColor(color);
    }
}
void JSB::font_slot()
{
    bool ok;
    QFont font = QFontDialog::getFont(&ok,QFont("楷体",18,5,true),this,"字体");
    if(ok)
    {
        this->edit->setFont(font);
    }
}

void JSB::about_slot()
{

}
void JSB::web_slot()
{
    QDesktopServices::openUrl(QUrl("https://blog.csdn.net/m0_72847002?spm=1010.2135.3001.5421"));
}
void JSB::ipv_slot()
{
    IPV * ipv = new IPV;
    ipv->show();

}

登录功能的头文件

#ifndef LOGIN_H
#define LOGIN_H

#include <QWidget>

namespace Ui {
class Login;
}

class Login : public QWidget
{
    Q_OBJECT

public:
    explicit Login(QWidget *parent = nullptr);
    ~Login();
public slots:
    void login();

private:
    Ui::Login *ui;
};

#endif // LOGIN_H

登录功能的函数实现

#include "login.h"
#include "ui_login.h"
#include "jsb.h"
Login::Login(QWidget *parent) :
    QWidget(parent),
    ui(new Ui::Login)
{
    ui->setupUi(this);

    this->setWindowTitle("登录");
    this->setWindowIcon(QIcon(":/image/Jsb3.png"));

    connect(ui->dl,&QPushButton::clicked,this,&Login::login);

}

Login::~Login()
{
    delete ui;
}

void Login::login()
{


    if(ui->id->text() == "1" && ui->passwd->text()=="1")
    {
        JSB *jsb = new JSB;
        jsb->show();
        this->close();
    }
}

登录功能的UI绘制

在这里插入图片描述

版本展示头文件

#ifndef IPV_H
#define IPV_H

#include <QWidget>
#include <QMovie>
namespace Ui {
class IPV;
}

class IPV : public QWidget
{
    Q_OBJECT

public:
    explicit IPV(QWidget *parent = nullptr);
    ~IPV();

private:
    Ui::IPV *ui;
};

#endif // IPV_H

版本号功能实现

#include "ipv.h"
#include "ui_ipv.h"

IPV::IPV(QWidget *parent) :
    QWidget(parent),
    ui(new Ui::IPV)
{
    ui->setupUi(this);

    QMovie *movie = new QMovie(":/image/q.gif");
    ui->label->setMovie(movie);
    movie->start();

}

IPV::~IPV()
{
    delete ui;
}

版本号界面UI绘制

在这里插入图片描述

效果图

在这里插入图片描述
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1023894.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

什么样的应用程序适合使用Flutter开发桌面?

桌面应用开发的现状 在过去&#xff0c;桌面应用程序的开发通常需要使用特定于操作系统的工具和语言&#xff0c;如C、C#、Java等。这导致了高昂的开发成本和维护困难。尽管有一些跨平台桌面开发工具&#xff0c;如Electron和Qt&#xff0c;但它们在性能、用户体验和开发效率方…

Linus Torvalds接受来自微软的Linux Hyper-V升级

微软最近推送了一些变更&#xff0c;旨在改进即将发布的 Linux 内核 6.6 版本对 Hyper-V 的支持。这些改进包括在 Hyper-V 上支持 AMD SEV-SNP guest 和 Intel TDX guest。除了这两项&#xff0c;还有其他一些升级&#xff0c;如改进了 VMBus 驱动程序中的 ACPI&#xff08;高级…

阿里云产品试用系列-负载均衡 SLB

阿里云负载均衡&#xff08;Server Load Balancer&#xff0c;简称SLB&#xff09;是云原生时代应用高可用的基本要素。通过将流量分发到不同的后端服务来扩展应用系统的服务吞吐能力&#xff0c;消除单点故障并提升应用系统的可用性。阿里云SLB包含面向4层的网络型负载均衡NLB…

Flink TaskManger 内存计算实战

Flink TaskManager内存计算图 计算实例 案例一、假设Task Process内存4GB。 taskmanager.memory.process.size4096m 先排减JVM内存。 JVM Metaspace 固定内存 256mJVM Overhead 固定比例 process * 0.1 4096 * 0.1 410m 得到 Total Flink Memory 4096-256-410 3430m 计…

Palantir的“英伟达时刻”即将到来

来源&#xff1a;猛兽财经 作者&#xff1a;猛兽财经 总结 &#xff08;1&#xff09;由于投资者对生成式人工智能的兴趣持续增加&#xff0c;Palantir的股价一直在上涨。 &#xff08;2&#xff09;Palantir已经连续三个季度实现了GAAP盈利&#xff0c;并将很快有资格被纳入标…

接口幂等性最佳实践--redis+注解

文章目录 一、概念二、常见解决方案三、本文实现四、实现思路五、项目简介六、代码实现1.pom2.JedisUtil3.自定义注解ApiIdempotent4.ApiIdempotentInterceptor拦截器5.TokenServiceImpl6.TestApplication 七、测试验证1.获取token的控制器TokenController2.TestController, 注…

Postman应用——Headers请求头设置

文章目录 Header设置Header删除或禁用Header批量编辑Header预设添加 一般在接口需要校验签名时&#xff0c;Headers请求头用来携带签名和生成签名需要的参数&#xff0c;在Postman也可以设置请求头在接口请求时携带参数。 Header设置 说明&#xff1a; Key&#xff1a;Header…

睿趣科技:新手商家如何做好抖音店铺

抖音&#xff0c;作为全球热门的社交媒体平台之一&#xff0c;不仅仅是分享有趣视频的地方&#xff0c;也是许多商家拓展业务的黄金平台。对于新手商家来说&#xff0c;如何在抖音上建立一个成功的店铺是一项重要的任务。以下是一些关于如何做好抖音店铺的建议。 明确你的目标和…

STM32实现PMBus从机程序

最近在野火的STM32F103VET6开发板上实现PMBus从机程序&#xff0c;这个程序参考了以下这篇博客的关于使用中断法实现I2C从机程序&#xff1a;STM32设置为I2C从机模式_iic从机_柒壹漆的博客-CSDN博客 &#xff0c;实测这个程序是可以正常运行的&#xff0c;感谢博主的分享&#…

Flink 类型机制 及 Stream API和Table API类型推断和转换

注&#xff1a;本文使用flink 版本是0.13 一、类型体系 Flink 有两大API &#xff08;1&#xff09;stream API 和 &#xff08;2&#xff09;Table API ,分别对应TypeInformation 和 DataType类型体系。 1.1 TypeInformation系统 TypeInformation系统是使用Stream一定会用…

【Linux】:Kafka组件介绍

目录 环境简介 一、消息 二、主题 三、分区 四、副本 五、生产者 六、消费者 七、消费者组 八、offsets【偏移量】 环境简介 Linux内核&#xff1a;Centos7 Kafka版本&#xff1a;3.5.1 执行命令的目录位置&#xff1a;Kafka安装目录的bin目录下&#xff1a;/usr/loca…

uvm源码解读-sequence,sequencer,driver三者之间的握手关系1

1.start item 1.start_item();sequencer.wait_for_grant(prior);this.pre_do(1);需要指出&#xff0c;这里明确说明了wait_for_grant和send_request之间不能有任何延迟&#xff0c;所以在mid_do这个任务里千万不能有任何延迟。 task uvm_sequencer_base::wait_for_grant(uvm…

MySQL进阶篇2-索引的创建和使用

索引 mkdir mysql tar -xvf mysqlxxxxx.tar -c myql cd mysql rpm -ivh .....rpm yum install openssl-develsystemctl start mysqldgerp temporary password /var/log/mysqld.logmysql -u root -p mysql> show variables like validate_password.% set global validate_…

maven本地安装jar包

在实际开发中&#xff0c;有些jar包不能通过公共库下载&#xff0c;只能本地安装。可以按照以下步骤操作&#xff1a; 1、安装命令&#xff1a; mvn install:install-file -DgroupIdcom.chinacreator.sm -DartifactIdfbm-sm-common -Dversion0.0.1 -Dpackagingjar -Dfile../n…

基于Java+SpringBoot+Vue+协同过滤算法的电影推荐系统(亮点:智能推荐、协同过滤算法、在线支付、视频观看)

协同过滤算法的电影推荐系统 一、前言二、我的优势2.1 自己的网站2.2 自己的小程序&#xff08;小蔡coding&#xff09;2.3 有保障的售后2.4 福利 三、开发环境与技术3.1 MySQL数据库3.2 Vue前端技术3.3 Spring Boot框架3.4 微信小程序 四、功能设计4.1 主要功能描述 五、系统实…

微服务学习(七):docker安装Mysql

微服务学习&#xff08;七&#xff09;&#xff1a;docker安装Mysql 1、拉取镜像 docker pull mysql2、查看安装的镜像 docker images3、安装mysql docker run -p 3306:3306 --name mysql \ -v /mydata/mysql/log:/var/log/mysql \ -v /mydata/mysql/data:/var/lib/mysql \…

【HarmonyOS】元服务卡片router实现跳转到指定页面

【关键字】 元服务卡片、router跳转不同页面 【写在前面】 本篇文章主要介绍开发元服务卡片时&#xff0c;如何实现从卡片中点击事件跳转到指定的应用内页面功能。此处以JS UI开发服务卡片为例&#xff0c;JS卡片支持组件设置action&#xff0c;包括router事件和message事件&…

Python配置与测试利器:Hydra + pytest的完美结合

简介&#xff1a;Hydra 和 pytest 可以一起使用&#xff0c;基于 Hydra Pytest 的应用可以轻松地管理复杂配置&#xff0c;并编写参数化的单元测试&#xff0c;使得Python开发和测试将变得更为高效。 安装&#xff1a; pip install hydra-core pytest案例源码&#xff1a;my…

系统架构设计师(第二版)学习笔记----软件工程

【原文链接】系统架构设计师&#xff08;第二版&#xff09;学习笔记----软件工程 文章目录 一、软件工程1.1 软件危机的表现1.2 软件工程的内容 二、软件过程模型2.1 软件的声明周期2.2 瀑布模型2.3 瀑布模型的缺点2.4 原型模型2.5 原型模型开发阶段2.6 开发原型的途径2.7 螺旋…

【音视频】ffplay源码解析-PacketQueue队列

包队列架构位置 对应结构体源码 MyAVPacketList typedef struct MyAVPacketList {AVPacket pkt; //解封装后的数据struct MyAVPacketList *next; //下一个节点int serial; //播放序列 } MyAVPacketList;PacketQueue typedef struct PacketQueue {MyAVPacketList …