#ifndef MAINWINDOW_H
#define MAINWINDOW_H
#include <QMainWindow>
#include <QMessageBox>
#include <QFileDialog>
#include <QTextStream>
#include "ui_mainwindow.h"
namespace Ui {
class MainWindow;
}
class MainWindow : public QMainWindow
{
Q_OBJECT
public:
explicit MainWindow(QWidget *parent = 0);
~MainWindow();
private:
Ui::MainWindow *ui;
bool isSaved;//为true 时标志文件已经保存,为false 时标志文件尚未保存
QString curFile;//保存当前文件的文件名
void do_file_New(); //新建文件
void do_file_SaveOrNot();//修改过的文件是否保存
void do_file_Save();//保存文件
void do_file_SaveAs();//文件另存为
bool saveFile(const QString& fileName);//存储文件
};
void MainWindow::do_file_SaveOrNot() //弹出是否保存文件对话框
{
if(ui->textEdit->document()->isModified()) //如果文件被更改过,弹出保存对话框
{
QMessageBox box;
box.setWindowTitle(tr("警告"));
box.setIcon(QMessageBox::Warning);
box.setText(curFile + tr(" 尚未保存,是否保存?"));
box.setStandardButtons(QMessageBox::Yes | QMessageBox::No);
if(box.exec() == QMessageBox::Yes) //如果选择保存文件,则执行保存操作
do_file_Save();
}
}
void MainWindow::do_file_New() //实现新建文件的功能
{
do_file_SaveOrNot();
isSaved = false;
curFile = tr("未命名.txt");
setWindowTitle(curFile);
ui->textEdit->clear(); //清空文本编辑器
ui->textEdit->setVisible(true); //文本编辑器可见
};
void MainWindow::do_file_Save() //保存文件
{
if(isSaved){ //如果文件已经被保存过,直接保存文件
saveFile(curFile);
}
else{
do_file_SaveAs(); //如果文件是第一次保存,那么调用另存为
}
}
void MainWindow::do_file_SaveAs() //文件另存为
{
QString fileName = QFileDialog::getSaveFileName(this,tr("另存为"),curFile);
//获得文件名
if(!fileName.isEmpty()) //如果文件名不为空,则保存文件内容
{
saveFile(fileName);
}
}
bool MainWindow::saveFile(const QString& fileName)
//保存文件内容,因为可能保存失败,所以具有返回值,来表明是否保存成功
{
QFile file(fileName);
if(!file.open(QFile::WriteOnly | QFile::Text))
//以只写方式打开文件,如果打开失败则弹出提示框并返回
{
QMessageBox::warning(this,tr("保存文件"),tr("无法保存文件 %1:\n %2").arg(fileName).arg(file.errorString()));
return false;
}//%1,%2 表示后面的两个arg 参数的值
QTextStream out(&file); //新建流对象,指向选定的文件
out << ui->textEdit->toPlainText(); //将文本编辑器里的内容以纯文本的形式输出到流对象中
isSaved = true;
curFile = QFileInfo(fileName).canonicalFilePath(); //获得文件的标准路径
setWindowTitle(curFile); //将窗口名称改为现在窗口的路径
return true;
}
#endif // MAINWINDOW_H
main.cpp
#include "mainwindow.h"
#include <QTextCodec> //加入头文件
#include <QApplication>
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
QTextCodec::setCodecForLocale(QTextCodec::codecForLocale());
MainWindow w;
w.show();
return a.exec();
}
mainwindow.cpp
#include "mainwindow.h"
#include <QtGui> //加入头文件
#include "ui_mainwindow.h"
MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MainWindow)
{
isSaved = false;
curFile=tr("未命名.txt");
setWindowTitle(curFile);
ui->setupUi(this);
}
MainWindow::~MainWindow()
{
delete ui;
}
.pro
#-------------------------------------------------
#
# Project created by QtCreator 2013-05-10T07:00:45
#
#-------------------------------------------------
QT += core gui
greaterThan(QT_MAJOR_VERSION, 4): QT += widgets
TARGET = MainWindow
TEMPLATE = app
SOURCES +=main.cpp\
mainwindow.cpp
HEADERS += mainwindow.h
FORMS += mainwindow.ui
RESOURCES += \
men.qrc
最后报错
5 个解决方案
#1
#2
求助啊,大神么么哒
#3
目前看出两个问题:
1:以后凡是QObject的子类(有Q_OBJECT宏),就要把函数体写到cpp文件里,头文件里只写声明,在Qt里有这个特殊要求。
2:ui->setupUi(this);应该在构造函数的第一行。
1:以后凡是QObject的子类(有Q_OBJECT宏),就要把函数体写到cpp文件里,头文件里只写声明,在Qt里有这个特殊要求。
2:ui->setupUi(this);应该在构造函数的第一行。
#4
第一种果然有用,第二个暂时还不理解,不过谢谢啦。。
#5
我也出现了这个问题,最后怎么解决的
#1
#2
求助啊,大神么么哒
#3
目前看出两个问题:
1:以后凡是QObject的子类(有Q_OBJECT宏),就要把函数体写到cpp文件里,头文件里只写声明,在Qt里有这个特殊要求。
2:ui->setupUi(this);应该在构造函数的第一行。
1:以后凡是QObject的子类(有Q_OBJECT宏),就要把函数体写到cpp文件里,头文件里只写声明,在Qt里有这个特殊要求。
2:ui->setupUi(this);应该在构造函数的第一行。
#4
第一种果然有用,第二个暂时还不理解,不过谢谢啦。。
#5
我也出现了这个问题,最后怎么解决的