Qt学习(二):一个简陋的记事本

这是我学习Qt这个软件的第二周,初步制作了一个具有简单新建、保存、打开功能的记事本。

总窗口设计图:

首先在maindow.h加入需要的头文件并且定义他们

#include <QMenu>
#include <QMenuBar>
#include <QAction>
#include <QDebug>
#include <QTextEdit>
#include <QLabel>
#include <QFileDialog>
#include <QStatusBar>
#include <QTextCursor>
#include <QMessageBox>
#include <QString>
#include <QFile>
#include <QTextStream>
private:
    QMenuBar *_menubar1;

    QMenu *_file;
    QMenu *_edit;
    QMenu *_ormat;
    QMenu *_view;
    QMenu *_help;

//编写文件的二级菜单
    QAction *_new;
    QAction *_open;
    QAction *_save;
    QAction *_saveas;


//
    QLabel *_label1;

//文本框
    QTextEdit *_text;

在定义需要用到的槽函数:

private slots:
   void show_label1(void);
    void openfile();
    void savefile();
    void newfile();

然后就是编写主程序了

//实例化
    _menubar1 = menuBar();
    _edit=new QMenu(this);
    _ormat=new QMenu(this);
    _view=new QMenu(this);
    _help=new QMenu(this);
    _file=new QMenu(this);

    _label1= new QLabel();


    _text= new QTextEdit();
    _text->setFont(QFont("宋体",15));                     //设置文本框在中心
    setCentralWidget(_text);

    _label1->setText("准备");
    statusBar()->addPermanentWidget(_label1);


//文件
    _file= _menubar1->addMenu("&文件(F)");
    _new= _file->addAction("&新建(n)");
    _new->setShortcut(QKeySequence(Qt::CTRL+Qt::Key_N));
    _new->setStatusTip("New File");
    _file->addSeparator();                               //分割线



    _open=_file->addAction("&打开(o)");
    _open->setShortcut(QKeySequence(Qt::CTRL+Qt::Key_O));
    _open->setStatusTip("Open File");
    _file->addSeparator();

    _save=_file->addAction("&保存(s)");
    _save->setShortcut(QKeySequence(Qt::CTRL+Qt::Key_S));
    _save->setStatusTip("Save File");
    _file->addSeparator();

    _saveas=_file->addAction("&另存为(a)");
    _saveas->setShortcut(QKeySequence(Qt::CTRL+Qt::Key_A));
    _saveas->setStatusTip("Save File As");
    _file->addSeparator();

    _edit= _menubar1->addMenu("&编辑(E)");
    _ormat=_menubar1->addMenu("&格式(O)");
    _view= _menubar1->addMenu("&查看(V)");
    _help= _menubar1->addMenu("&帮助(H)");

    connect(_text,SIGNAL(cursorPositionChanged()),this,SLOT(show_label1()));
    connect(_open,SIGNAL(triggered(bool)),this,SLOT(openfile()));
    connect(_save,SIGNAL(triggered(bool)),this,SLOT(savefile()));
    connect(_new,SIGNAL(triggered(bool)),this,SLOT(newfile()))

编写捕获鼠标并且显示行列的函数:

void MainWindow::show_label1()
{
    QTextCursor _cursor=_text->textCursor();
    int linenum = _cursor.blockNumber();                   //读取行
    int colnum = _cursor.columnNumber();
    _label1->setText(tr("行数:%1,列数:%2").arg(linenum+1).arg(colnum));

}

先写新建文件的函数(因为后面打开也要用):

void MainWindow::openfile()
{
    QString path = QFileDialog::getOpenFileName(
                this,                                           //父窗口
                tr("打开文件"),
                "." ,                                            //默认目录
                tr("Text Files(*.txt);;ini File(*.ini)")
                );
    if(!path.isEmpty())
    {
        QFile file(path);
        if(!file.open(QIODevice::ReadOnly|QIODevice::Text))
                return;                                         //失败
        QTextStream in(&file);
        _text->setText(in.readAll());
        file.close();

    }
}

然后是保存:

void MainWindow::savefile()
{
    QString path = QFileDialog::getSaveFileName(
                this,
                tr("保存文件"),
                ".",
                tr("Text Files(*.txt);;ini File(*.ini)")
                );
    if(!path.isEmpty())
        {
            QFile file(path);
            if (!file.open(QIODevice::WriteOnly | QIODevice::Text))
                return;                                             //打开失败

            QTextStream out(&file);
            out << _text->toPlainText();
            file.close();
        }
}

然后是简单的新建文件的函数:

void MainWindow::newfile()
{
    QString input = _text->toPlainText();

    if ( input.isEmpty() )
    {
        openfile();                                       //输入为空,打开
    }
    else
    {
        savefile();                                        //保存
    }
}

(但是没有检测文档是否为空,只是实现了简单的新建)

保存的效果图(打开与此类似,所以不再截图):

简单的记事本就这样完成了,欢迎大家一起讨论变强。

猜你喜欢

转载自blog.csdn.net/bingkuoluo/article/details/80394338