QT学习笔记2

前面大概介绍了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



Previous     Next
/
Published under (CC) BY-NC-SA in categories C&&C++  tagged with