前面大概介绍了QT的机制和控件的使用,现在开始写一个记事本,可以打开和保存文本文件。
头文件notepad.h
头文件一般用来定义用户自己写或者继承的类,定义构造函数和其他实现功能逻辑的成员函数,还有一些私有成员变量。
#ifndef NOTEPAD_H
#define NOTEPAD_H
#include <QMainWindow>
#include <QTextEdit>
#include <QAction>
#include <QMenu>
class Notepad : public QMainWindow
{
Q_OBJECT
public:
Notepad();
private slots:
void open();
void save();
void quit();
private:
QTextEdit *textEdit;
QAction *openAction;
QAction *saveAction;
QAction *exitAction;
QMenu *fileMenu;
};
#endif
其中open(),save(),quit()是用来接受信号后处理的槽函数,具体的实现在notepad.cpp中。
源文件notepad.cpp
#include "notepad.h"
#include "ui_notepad.h"
#include <QFileDialog>
#include <QMessageBox>
#include <QString>
#include <QTextStream>
#include <QMenu>
#include <QMenuBar>
Notepad::Notepad()
{
openAction=new QAction(("&Open"),this);
saveAction=new QAction("&Save",this);
exitAction=new QAction("E&xit",this);
connect(openAction,SIGNAL(triggered()),this,SLOT(open()));
connect(saveAction,SIGNAL(triggered()),this,SLOT(save()));
connect(exitAction,SIGNAL(triggered()),this,SLOT(quit()));
//fileMenu=menuBar()->addMenu("File");//Copy
fileMenu=this->menuBar()->addMenu("File");
fileMenu->addAction(openAction);
fileMenu->addAction(saveAction);
fileMenu->addSeparator();
fileMenu->addAction(exitAction);
textEdit=new QTextEdit;
setCentralWidget(textEdit);
setWindowTitle("Notepad");
}
void Notepad::open()
{
QString fileName=QFileDialog::getOpenFileName(this,"Open File","", \
"Text Files(*txt);;c++ Files(*.cpp *.h)");
if(fileName!=""){
QFile file(fileName);
if(!file.open(QIODevice::ReadOnly)){
QMessageBox::critical(this,"Error","could not open file");
return;
}
QTextStream in(&file);
textEdit->setText(in.readAll());
file.close();
}
}
void Notepad::save()
{
QString fileName=QFileDialog::getSaveFileName(this,"Save File","", \
"Text Files(*.txt);;C++ Files(*.cpp *.h)");
if(fileName!=""){
QFile file(fileName);
if(!file.open(QIODevice::WriteOnly)){
//error
}else{
QTextStream stream(&file);
stream<<textEdit->toPlainText();
stream.flush();
file.close();
}
}
}
void Notepad::quit()
{
QMessageBox messageBox;
messageBox.setWindowTitle(tr("Notepad"));
messageBox.setText(tr("Do you really want to quit?"));
messageBox.setStandardButtons(QMessageBox::Yes | QMessageBox::No);
messageBox.setDefaultButton(QMessageBox::No);
if (messageBox.exec() == QMessageBox::Yes)
qApp->quit();
}
notepad.cpp中主要实现在notepad.h中定义的成员函数。Notepad()是构造函数,建立一个对象时会自动调用。open()函数打开文本文件,save()保存文本文件,quit()退出界面。
QAction是QObject的一个子类,构造函数是QAction(const QString &text, QObject* parent)
,用来建立Menu下的三个下拉菜单。
fileMenu=menuBar()->addMenu("File")
这一句话比较难理解,可以换作fileMenu=this->menuBar()->addMenu("File")
看。menuBar()在qmianwindow.h中定义为QMenuBar *menuBar() const
。
menuBar()是一个指向QMenuBar的指针,就是调用Notepad继承自QMainWindow的成员函数,将File目录添加到menuBar中赋值给fileMenu对象。
getOpenFileName和critical都是静态方法。用来获取打开的文件名和输出错误提示。多注意一下静态方法和静态变量的使用,参见C++ Primer Page 268~272。
Main函数
修改Main函数如下:
#include "notepad.h"
#include <QApplication>
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
Notepad *pad=new Notepad;
pad->show();
return a.exec();
}
运行结果如图
Reference
[1].http://qt-project.org/doc/qt-4.8/gettingstartedqt.html
[2].http://see.xidian.edu.cn/cpp/biancheng/view/210.html
[3].C++ Primer. Page268~272