代码及注释如下:
//mainwindow.h
#ifndef MAINWINDOW_H
#define MAINWINDOW_H
#include <QTextEdit>
#include <QMainWindow>
//class QTextEdit;
class MainWindow : public QMainWindow
{
Q_OBJECT
public:
explicit MainWindow(QWidget *parent = 0);//指定这个构造器只能被明确的调用/使用, 不能作为类型转换操作符被隐含的使用。
//C++中, 一个参数的构造函数(或者除了第一个参数外其余参数都有默认值的多参构造函数),
//承担了两个角色。 1 是个构造器 ,2 是个默认且隐含的类型转换操作符。
//MainWindow::MainWindow(QWidget *parent) :
// QMainWindow(parent)
// 为实现的内容:MainWindow继承QMainWindow(parent),
//但是此时因为QMainWindow是主窗口,可以不需要继承其他的窗口
~MainWindow();
private slots:
//private slots:
void openFile();
void saveFile();
//public slots:在这个区内声明的槽意味着任何对象都可将信号与之相连接。这对于组件编程非常有用,
//你可以创建彼此互不了解的对象,将它们的信号与槽进行连接以便信息能够正确的传递。
//protected slots:在这个区内声明的槽意味着当前类及其子类可以将信号与之相连接。这适用于那些槽,
//它们是类实现的一部分,但是其界面接口却面向外部。
//private slots:在这个区内声明的槽意味着只有类自己可以将信号与之相连接。这适用于联系非常紧密的类。
private:
QAction *openAction;
QAction *saveAction;
QTextEdit *textEdit;
};
#endif // MAINWINDOW_H
//mainwindow.cpp
//#include <QtGui>
#include <QtWidgets>
#include "mainwindow.h"
#include <QStatusBar>
MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent)//
{
openAction = new QAction(QIcon(":/images/file-open"), tr("&Open..."), this);
openAction->setShortcuts(QKeySequence::Open);
openAction->setStatusTip(tr("Open an existing file"));
connect(openAction, &QAction::triggered, this, &MainWindow::openFile);
//因为没有加入状态栏,所以第10行和第15行的代码无法显示,???后面加上//
//triggered表示触发器的意思,表示如果openAction触发了会连接到openFile上,槽函数可以是普通的函数
saveAction = new QAction(QIcon(":/images/file-save"), tr("&Save..."), this);
saveAction->setShortcuts(QKeySequence::Save);
saveAction->setStatusTip(tr("Save a new file"));
QObject::connect(saveAction, &QAction::triggered, this, &MainWindow::saveFile);
QMenu *file = menuBar()->addMenu(tr("&File"));
//QMenuBar *QMainWindow::menuBar() const
//QMenu *QMenuBar::addMenu(const QIcon &icon, const QString &title)
file->addAction(openAction);
file->addAction(saveAction);
//可以有多个addMenu(),但是工具栏只能有一个横栏,只需addToolBar
//QMenuBar:就是所有窗口的菜单栏,在此基础上添加不同的QMenu和QAction
//QMenu:菜单栏里面菜单,可以显示文本和图标,但是并不负责执行操作,有点类似label的作用
//QAction: Qt 将用户与界面进行交互的元素抽象为一种“动作”,使用QAction类表示。QAction才是真正负责执行操作的部件。
//QMenu与QMenuBar的区别
QToolBar *toolBar = addToolBar(tr("&File"));//QToolBar *QMainWindow::addToolBar(const QString &title)
toolBar->addAction(openAction);
toolBar->addAction(saveAction);
textEdit = new QTextEdit(this);
setCentralWidget(textEdit);
//一个Qt主窗口应用程序必须有一个中心窗口部件(Central Widget)。当你采用Qt Designer创建主窗口时,默认情况下,
// 系统已经为你创建了一个中心窗口部件,它是子类化QWidget的。
//结合代码可以方便的设置中心窗口部件,可以调用主窗口类的setCentralWidget()方法,它的原型如下:
//void QMainWindow::setCentralWidget ( QWidget * widget )
statusBar();//QStatusBar *QMainWindow::statusBar() const
}
MainWindow::~MainWindow()
{
}
void MainWindow::openFile()
{
QString path = QFileDialog::getOpenFileName(this, tr("Open File"), ".", tr("Text Files(*.txt)"));
//QFileDialog::getOpenFileName()返回值是选择的文件路径。
//我们将其赋值给 path。通过判断 path 是否为空,可以确定用户是否选择了某一文件。只有当用户选择了一个文件时,我们才执行下面的操作。
//QString fileName = QFileDialog::getOpenFileName(this, tr("Open File"),"/home",tr("Images (*.png *.xpm *.jpg)"));
if(!path.isEmpty()) {//若不为空,进行操作,反之,直接弹出另一个文本框
QFile file(path);
if (!file.open(QIODevice::ReadOnly | QIODevice::Text)) { //1110|0010
QMessageBox::warning(this, tr("Read File"), tr("Cannot open file:\n%1").arg(path));
//[static] int QMessageBox::warning(QWidget *parent, const QString &title, const QString &text, int button0, int button1, int button2 = 0)
return;
}
QTextStream in(&file);
textEdit->setText(in.readAll());
file.close();
//首先,我们创建一个QFile对象,将用户选择的文件路径传递给这个对象。然后我们需要打开这个文件,使用的是QFile::open(),
//其参数是指定的打开方式,这里我们使用只读方式和文本方式打开这个文件(因为我们选择的是后缀名 txt 的文件,可以认为是文
//本文件。当然,在实际应用中,可能需要进行进一步的判断)。QFile::open()打开成功则返回 true,由此继续进行下面的操作:
//使用QTextStream::readAll()读取文件所有内容,然后将其赋值给QTextEdit显示出来。最后不要忘记关闭文件。
} else {
QMessageBox::warning(this, tr("Path"), tr("You did not select any file."));
//第一个tr中的内容是对话框的标题
//第二个tr中的内容是对话框的警示部分
}
}
void MainWindow::saveFile()
{
QString path = QFileDialog::getSaveFileName(this, tr("Save File"), ".", tr("Text Files(*.txt)"));
if(!path.isEmpty()) {
QFile file(path);
if (!file.open(QIODevice::WriteOnly | QIODevice::Text)) {
QMessageBox::warning(this, tr("Write File"), tr("Cannot open file:\n%1").arg(path));
return;
}
QTextStream out(&file);
out << textEdit->toPlainText();
file.close();
} else {
QMessageBox::warning(this, tr("Path"), tr("You did not select any file."));
}
}
//main.cpp#include <QApplication>#include "mainwindow.h"int main(int argc, char *argv[]){ QApplication a(argc, argv); MainWindow w; w.show(); return a.exec();}