这是我学习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(); //保存
}
}
(但是没有检测文档是否为空,只是实现了简单的新建)
保存的效果图(打开与此类似,所以不再截图):
简单的记事本就这样完成了,欢迎大家一起讨论变强。