2011-08-18 83 views
2

我正在使用qtextedit在我的軟件中記錄活動日誌。稍後當我想使用toPlainText()將其保存爲文本時,生成的文本文件是單行而沒有任何換行符。 我開始通過plainText()記錄並使用append()添加後續添加。新行沒有寫入文件(Qt)

void rocketscience::saveLog(){ 
QFile logFile; 
QTextStream logOut; 
QString logfName; 

QSettings prevSet("us","fr"); 

    if (defaultDir.exists(prevSet.value("settings/logPath").toString())) 
     logfName= QFileDialog::getSaveFileName(this,"Save File",fName,"Text (*.txt"); 


    if (logfName!=NULL){ 

    logFile.setFileName(logfName); 
    logFile.open(QIODevice::WriteOnly); 
    logOut.setDevice(&logFile); 
    logOut<<ui.statusReport->toPlainText(); 
    logFile.close(); 
} 

}

回答

2

從QTextStream類參考(該行是有點隱藏):

注意:在Windows ,如果使用QIODevice :: Text標誌打開QTextStream的設備或字符串,則所有'\ n'字符都寫爲'\ r \ n'。

其中'\ n'是UNIX行尾,'\ r \ n'是Windows行尾(CR/LF)。

在你的方法開始拆除QTextStream初始化和改變if語句這樣:

if (!logfName.isEmpty()) 
{ 
    logFile.setFileName(logfName); 
    logFile.open(QIODevice::WriteOnly); 
    QTextStream logOut(&logFile, QIODevice::Text); 
    logOut<<ui.statusReport->toPlainText(); 
    logFile.close(); 
} 

另外請注意我是如何改變的,如果條件。 logfName是默認設置爲「」,我不知道如果比較爲NULL將工作。你最好使用QString :: isEmpty()函數

+0

y ..工作,,,謝謝。 – Maxes

+0

由於它是一個局部變量,它不會爲NULL。 NULL是指針類型的有效值。 – Spidey

+0

可能有一個QString超載,但我一直懶得檢查,所以我說我不知道​​;) –

1

大概文件使用UNIX行尾寫的?你應該在文本打開文件,獲取本地(視窗)行結束:

logFile.open(QIODevice::WriteOnly|QIODevice::Text); 
0

我有同樣的問題。然而,由@Tim Meyer提供的解決方案並不適合我。在該行中:

QTextStream logOut(&logFile, QIODevice::Text); 

顯示錯誤。所以,我做了以下工作,併爲QT5.8工作:

/** 
* Method to save a text file. 
* @param asFileName: Complete file path, including name and extension. 
* @param asText: Text to be written in the file 
* @return true if the save was successful, false otherwise. 
*/ 
bool MainWindow::saveFile(QString asFileName, QString asText) 
{ 
    QFile file(asFileName); 

    if (!file.open(QIODevice::WriteOnly | QIODevice::Text)){ 
     QMessageBox::critical(this,"Error","File could not be opened"); 
     return false; 
    } 

    QTextStream out(&file); 
    out << asText; 
    file.close(); 

    return true; 
}