collect2.exe:-1: 错误:error: ld returned 1 exit status 求过来人解答

时间:2021-01-26 18:34:31
[img=http://][/img]mainwindow.h
#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


collect2.exe:-1: 错误:error: ld returned 1 exit status 求过来人解答

#2


求助啊,大神么么哒

#3


目前看出两个问题:
1:以后凡是QObject的子类(有Q_OBJECT宏),就要把函数体写到cpp文件里,头文件里只写声明,在Qt里有这个特殊要求。
2:ui->setupUi(this);应该在构造函数的第一行。

#4


引用
目前看出两个问题:
1:以后凡是QObject的子类(有Q_OBJECT宏),就要把函数体写到cpp文件里,头文件里只写声明,在Qt里有这个特殊要求。
2:ui->setupUi(this);应该在构造函数的第一行。


第一种果然有用,第二个暂时还不理解,不过谢谢啦。。

#5


我也出现了这个问题,最后怎么解决的

#1


collect2.exe:-1: 错误:error: ld returned 1 exit status 求过来人解答

#2


求助啊,大神么么哒

#3


目前看出两个问题:
1:以后凡是QObject的子类(有Q_OBJECT宏),就要把函数体写到cpp文件里,头文件里只写声明,在Qt里有这个特殊要求。
2:ui->setupUi(this);应该在构造函数的第一行。

#4


引用
目前看出两个问题:
1:以后凡是QObject的子类(有Q_OBJECT宏),就要把函数体写到cpp文件里,头文件里只写声明,在Qt里有这个特殊要求。
2:ui->setupUi(this);应该在构造函数的第一行。


第一种果然有用,第二个暂时还不理解,不过谢谢啦。。

#5


我也出现了这个问题,最后怎么解决的