【qt】QMainWindow下实现一个记事本

之前我们学过QWidget,QMainWindow会在ui界面多一个菜单

先实现ui界面

1.添加文本编辑,实现可以写多行

2.将文本编辑放大,拖动即可

3.编辑菜单栏

4.然后我们要实现对应子列表的功能,但是在这里不能转到槽,所以我们只能通过connect来联系功能和对应按键,我们先给我们的子列表对象重命名一下

代码部分

1.实现新建文件

定义一个槽函数实现新建文件的槽函数,然后在构造函数中connect,联系点击新建,执行槽函数,

槽函数中要做的功能是将标题设置为无标题,然后文本内容清空

2.实现打开文件,同样是声明槽函数,实现关联connect,实现槽函数

槽函数中要做的是使用QFileDialog类中一个函数getOpenFileName,来打开一个文件,返回打开文件的路径字符串,如果为空的话,就显示一个消息盒子警告没有选择上,也就是按了取消以后会提醒,如果选择的话,创建一个文件用读方式打开他,使用readAll函数读取该文件内容到QByteArray 中,你可以把他当做vector, 然后写入到ui界面的文本编辑中,向文本编辑中写入时,必须是QString,QString中有个构造函数直接将QByteArray转为QString,然后关闭文件

3.实现保存功能

完成保存文件槽函数声明,实现槽函数和保存按键关联connect,实现槽函数

槽函数的实现需要QFileDialog类中的函数getSaveFileName函数来获取要保存文件的地方,返回值为要保存在哪个地方的字符串,如果字符串为空,说明没有选择保存路径,如果有的话,打开该文件,以读的方式,将文本编辑内容读到QByteArray (vector)中,然后从vector中读取内容到文件中去,关闭文件

槽函数实现:

源码分享

mainwindow.h

c 复制代码
#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>
#include<QString>
#include<QFileDialog>
#include<QMessageBox>
QT_BEGIN_NAMESPACE
namespace Ui { class MainWindow; }
QT_END_NAMESPACE

class MainWindow : public QMainWindow
{
    Q_OBJECT

public:
    MainWindow(QWidget *parent = nullptr);
    ~MainWindow();
private slots:
    void Newfilespots();
    void Openfilespots();
    void Savefilespots();

private:
    Ui::MainWindow *ui;
};
#endif // MAINWINDOW_H

mainwindow.cpp

c 复制代码
#include "mainwindow.h"
#include "ui_mainwindow.h"

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

    connect(ui->Newfile,&QAction::triggered,this,&MainWindow::Newfilespots);
    connect(ui->Openfile,&QAction::triggered,this,&MainWindow::Openfilespots);
    connect(ui->Savefile,&QAction::triggered,this,&MainWindow::Savefilespots);

}

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

void MainWindow::Newfilespots()
{
  ui->textEdit->clear();
  this->setWindowTitle("无标题");

}
void MainWindow::Openfilespots()
{
    QString filename=QFileDialog::getOpenFileName(this,"选择一个文件",QCoreApplication::applicationFilePath(),".txt");
     if(filename.isEmpty())
     {

       QMessageBox::warning(this,"警告","请选择一个文件");


     }
     else
      {
        QFile file(filename);
        file.open(QIODevice::ReadOnly);
        QByteArray ba=file.readAll();
        ui->textEdit->setText(QString(ba));
        file.close();





     }




}
 void MainWindow::Savefilespots()
 {

     QString filename=QFileDialog::getSaveFileName(this,"选择一个文件",QCoreApplication::applicationFilePath(),".txt");
      if(filename.isEmpty())
      {

        QMessageBox::warning(this,"警告","请选择一个文件");


      }
      else
      {
          QFile file(filename);
          file.open(QIODevice::WriteOnly);
          QByteArray ba;
          ba.append(ui->textEdit->toPlainText());
          file.write(ba);
          file.close();


      }









 }

效果演示

记事本

事件

在qt中我们还可以捕捉键盘信息和鼠标信息,我们可以重写虚函数实现对应键盘信息,鼠标信息做出我们自己的需求.

我们基于上节课代码我们要实现Ctrl

事件

相关推荐
搬码后生仔10 分钟前
SQLite 是一个轻量级的嵌入式数据库,不需要安装服务器,直接使用文件即可。
数据库·sqlite
码农君莫笑11 分钟前
Blazor项目中使用EF读写 SQLite 数据库
linux·数据库·sqlite·c#·.netcore·人机交互·visual studio
云空12 分钟前
《解锁 Python 数据挖掘的奥秘》
开发语言·python·数据挖掘
江上挽风&sty13 分钟前
【Django篇】--动手实践Django基础知识
数据库·django·sqlite
向阳121817 分钟前
mybatis 动态 SQL
数据库·sql·mybatis
胡图蛋.18 分钟前
什么是事务
数据库
小黄人软件20 分钟前
20241220流水的日报 mysql的between可以用于字符串 sql 所有老日期的,保留最新日期
数据库·sql·mysql
青莳吖23 分钟前
Java通过Map实现与SQL中的group by相同的逻辑
java·开发语言·sql
张声录125 分钟前
【ETCD】【实操篇(三)】【ETCDCTL】如何向集群中写入数据
数据库·chrome·etcd
Buleall30 分钟前
期末考学C
java·开发语言