为跨平台文本编辑器应用程序更改QTextStream的QT行结束样式

时间:2018-04-11 01:19:53

标签: windows qt encoding cross-platform line-endings

所以我正在构建一个跨平台的QT文本编辑器。我正在Linux上开发,以Windows为目标。我正在尽可能简单地让用户使用他们希望的编码保存文本文件。

我通过他们网站上的教程用M Cross Environment "MXE"编译了项目。

在Linux上,到目前为止,一切都完美无缺。

但是,在Windows上,如果我使用文本编辑器创建文件(无论我选择何种编码),然后在记事本中打开它,整个文件就在一行中。

我相当确定我发现了这个问题。如果我打开我的QT文本编辑器创建的文件,Emacs说它有一个" Unix" "线条结束。"

我假设Windows无法识别新行字符,因为它们是Unix风格。但是,我不确定如何改变线条样式的结束"在QTextStream。文档似乎没有任何帮助,我无法在Stack溢出或其他方面找到其他有同样问题的人。

以下是我保存文件的代码。 encodeString变量控制保存文件的编码。

void mainwindow::on_actionSave_triggered()
{
    if (!saveFile.isEmpty())
    {
      //"saveFile" is populated with the file name when the file is first opened.
        QFile file(saveFile); 
        if (!file.open(QIODevice::WriteOnly))
        {
            qDebug() << "Could not find file."

        }
        else
        {
      //The following if statements will save the file in the proper encoding dependant on the value of "encodeString."
            QTextStream stream(&file)
            if (encodeString == "Plain Text")
            {
                stream << ui->textEdit->toPlainText();
                stream.flush();
                file.close();
            }

            if (encodeString == "UTF-8")
            {
                stream.setCodec("UTF-8");
                stream.setGenerateByteOrderMark(true);
                stream << ui->textEdit->toPlainText();
                stream.flush();
                file.close();
            }

            if (encodeString == "UTF-16")
            {
                stream.setCodec("UTF-16");
                stream.setGenerateByteOrderMark(true);
                stream << ui->textEdit->toPlainText();
                stream.flush();
                file.close();
            }

            if (encodeString == "UTF-16BE")
            {
                stream.setCodec("UTF-16BE");
                stream.setGenerateByteOrderMark(true);
                stream << ui->textEdit->toPlainText();
                stream.flush();
                file.close();
            }

            if (encodeString == "UTF-32")
            {
                stream.setCodec("UTF-32");
                stream.setGenerateByteOrderMark(true);
                stream << ui->textEdit->toPlainText();
                stream.flush();
                file.close();
            }

            if (encodeString == "UTF-32BE")
            {
                stream.setCodec("UTF-32BE");
                stream.setGenerateByteOrderMark(true);
                stream << ui->textEdit->toPlainText();
                stream.flush();
                file.close();
            }


        }
    }


}

以下是打开文件的代码。它只是流式传输到ui->textEdit作为次要问题,我希望能够将正在打开的文件的编码记录为encodeString的值。

void MainWindow::on_actionOpen_triggered()
{
  QString fileName = QFileDialog::getOpenFileName(this, tr("Open File"), QString(), tr("All Files (*.*);;Text Files (*.txt);;C++ Files (*.cpp *.h)"));  //Opens the QDialog for opening files.
  saveFile =fileName;       //Sets the value of "saveFile" to the value of "fileName." This insures that any time a "Save" function is performed, the file that the text is saved to, is the one that is intended.
    MainWindow::setWindowTitle(saveFile);
    if(!fileName.isEmpty()) // As long as the file name variable is not empty, this will trigger.
    {
        QFile file(fileName);
        if(!file.open(QIODevice::ReadOnly)) // If the file could not be opened, it will trigger this error message.
        {
            QMessageBox::critical(this, tr("Error"), tr("Could not open file"));
                        return;
        }
        QTextStream in(&file);      //This sets the variable "in" to be the contents of the file.
    ui->textEdit->setText(in.readAll());    //This sets the text that is in the text edit field to be the contents of the file.
    file.close();       //This closes the file so that no memory errors are caused by having too many files open.
    }
}

1 个答案:

答案 0 :(得分:0)

我真的很讨厌在这里回答我自己的问题,但我实际上能够在QT论坛上找到有同样问题的其他人。那是InstantiateInline interface。使用这篇文章中的信息和一些小调整,我不仅可以使用正确的Windows&#34;行结束&#34;来保存文件,但我还能够使用正确的编码保存文件。 QTextEdit中的文字保存为Qstring。然后,使用.replace的{​​{1}}函数将结束的行从Qstring更改为\n。然后设置\r\n编码(如果是纯文本,则设置为否),QTextStream将流式传输到Qstring。然后将QTextStream发送到该文件。保存和操作QTextStream是在编码Qstring语句之前完成的,以减少所需的代码量。

这是完整的保存功能。

if