从文件读取时,所有数据都会被删除 void visualidar::open() {QString fileName=QFileDialog::getOpenFileName(this,tr(“打开图像”), QDir::homePath(),tr(“图像(*.tif)”); 如果(!fileName.isEmpty()) { QApplication::setOverrideCursor(QCursor(Qt::WaitCursor)); pixmapWidget->setPixmap(文件名); QString dataFileName=fileName.replace(fileName.length()-3,3,“csv”); QFile数据(数据文件名); 如果(!data.open(QIODevice::ReadOnly | QIODevice::Text)) { 警告(这是“NoCSV文件源!”, QString(“未找到%1文件!”).arg(数据文件名)); } QTextStream文本(和数据); text.setCodec(“UTF-8”); QString dataString=text.readAll(); ((QStandardItemModel*)文件小部件->模型())->清除(); fileWidget->AddRowsFromString(数据字符串); fileWidget->setOutputFile(数据文件名); data.close(); QApplication::restoreOverrideCursor(); } } 类CFileWidget:publicQTableView { Q_对象 公众: CFileWidget(QWidget*父项); ~CFileWidget(); void setOutputFile(常量QString文件名) {outputFile.setFileName(文件名); outputFile.open(QIODevice::WriteOnly | QIODevice::Text);} 公众时段: void AddRowsFromString(常量QString&text); void DeleteSelectedRows(); void AddRow(); void SaveToFile(); 信号: void SelectRects(常量QList和rects、常量QList和parenRects); 受保护插槽: 无效选择已更改(常量QItemSelection&selected,常量QItemSelection&Diselected); 私人: int addonId; QFile输出文件; }; void CFileWidget::SaveToFile() { QTextStream textStream(&outputFile); setCodec(“UTF-8”); 对于(int row=0;rowrowCount();++row) { int列=0; 而(((QStandardItemModel*)model())->项(行、列)) { textStreamdata(Qt::DisplayRole).toString(); textStream
Qt只是一个IDE,它有自己的封装库,不应该与正常的文件操作有太大的不同。你确定文件是空的还是看起来像空的?我不记得它的确切名称,但数据首先被缓冲,需要被推送到一个文件中,在这两个过程之间,它看起来像空的。如果你打开一个不启用“附加”的文件,然后程序开始运行并退出,文件将为空。一旦使用append on打开文件,指针将指向结尾。Oki,发生的情况是程序完全按照您的要求运行。然后使用QIODevice::ReadOnly打开文件进行读取,您将获得数据,并且不会发生任何错误 然后打开它进行写操作,您应该(从应用程序逻辑的角度)决定要做什么。如果要覆盖文件内容,您应该使用WriteOnly模式,它的工作方式与fopen()调用中的“w”模式完全相同,因此它会在打开时截断文件内容,因此一旦打开文件,内容就会丢失从文件读取时,所有数据都会被删除 void visualidar::open() {QString fileName=QFileDialog::getOpenFileName(this,tr(“打开图像”), QDir::homePath(),tr(“图像(*.tif)”); 如果(!fileName.isEmpty()) { QApplication::setOverrideCursor(QCursor(Qt::WaitCursor)); pixmapWidget->setPixmap(文件名); QString dataFileName=fileName.replace(fileName.length()-3,3,“csv”); QFile数据(数据文件名); 如果(!data.open(QIODevice::ReadOnly | QIODevice::Text)) { 警告(这是“NoCSV文件源!”, QString(“未找到%1文件!”).arg(数据文件名)); } QTextStream文本(和数据); text.setCodec(“UTF-8”); QString dataString=text.readAll(); ((QStandardItemModel*)文件小部件->模型())->清除(); fileWidget->AddRowsFromString(数据字符串); fileWidget->setOutputFile(数据文件名); data.close(); QApplication::restoreOverrideCursor(); } } 类CFileWidget:publicQTableView { Q_对象 公众: CFileWidget(QWidget*父项); ~CFileWidget(); void setOutputFile(常量QString文件名) {outputFile.setFileName(文件名); outputFile.open(QIODevice::WriteOnly | QIODevice::Text);} 公众时段: void AddRowsFromString(常量QString&text); void DeleteSelectedRows(); void AddRow(); void SaveToFile(); 信号: void SelectRects(常量QList和rects、常量QList和parenRects); 受保护插槽: 无效选择已更改(常量QItemSelection&selected,常量QItemSelection&Diselected); 私人: int addonId; QFile输出文件; }; void CFileWidget::SaveToFile() { QTextStream textStream(&outputFile); setCodec(“UTF-8”); 对于(int row=0;rowrowCount();++row) { int列=0; 而(((QStandardItemModel*)model())->项(行、列)) { textStreamdata(Qt::DisplayRole).toString(); textStream,file,qt,File,Qt,Qt只是一个IDE,它有自己的封装库,不应该与正常的文件操作有太大的不同。你确定文件是空的还是看起来像空的?我不记得它的确切名称,但数据首先被缓冲,需要被推送到一个文件中,在这两个过程之间,它看起来像空的。如果你打开一个不启用“附加”的文件,然后程序开始运行并退出,文件将为空。一旦使用append on打开文件,指针将指向结尾。Oki,发生的情况是程序完全按照您的要求运行。然后使用QIODevice::ReadOnly打开文件进行读取,您将获得数据,并且不会发生任何错误 然后打开它进行写操作,您
如果你想保留内容并添加一些东西,考虑使用AppEnter模式,这样你就可以在不丢失内容的情况下添加数据文件。
检查此项:您发布的代码看起来并不是很有害,肯定会导致文件内容丢失。是否可以使用写入选项打开同一个文件?若要附加,请使用QIODevice::append在读取文件后,关闭该文件,但在代码中保留文件名。我使用“仅写”和“文本模式写入数据”打开该文件。它只是weird如果我刚刚打开它,并且代码没有达到“保存到文件”功能的行数,那么我会最小化我的程序,转到资源管理器,看到我刚刚打开的文件大小为0(但为70 Kb)是在读取前还是读取后清空文件?如果你退出应用程序,数据是否完全消失?是的,我已经丢失了一个文件,这样你应该显示最少的代码来清除文件。你现在显示的代码不能这样做。对我来说,VS也是IDE,有自己的封装库。不知道为什么有些人因为如果你想被视为专业开发人员,我相信你至少应该使用合适的术语来回答一个问题。VS确实是一个IDE,尽管我不认为它与神秘的“封装库”有什么关系……VS是一个IDE,Qt创建者是一个IDE。Qt是一个API,.NET是一个API。通常最好在与他们的对话中要具体,因为这里的所有内容都可以搜索。作为一个添加,他正在使用只读标志打开文件,因此设置append应该不会有什么区别。文件在资源管理器中是空的,正如我所说的,如果出现错误,并且我没有将数据保存到文件中,则文件是空的,甚至以前的数据文件在读写之间也是空的如果在该时间间隔内发生错误,我将丢失所有内容。如果文件在读取后正确关闭,并且在写入文件内容之前发生错误,则无法丢失文件内容。如果打开文件进行写入,并且在实际调用写入之前发生错误,则会丢失内容。错误发生在我处理程序中的数据时,不按sa键ve to file按钮主要的问题是,为什么我从文件中读取,然后在资源管理器中检查文件的大小为零,我在c中使用基本的输入输出函数,但从未遇到过这个问题
void visualICDAR::open()
{QString fileName = QFileDialog::getOpenFileName( this, tr( "Open Image" ),
QDir::homePath(), tr("Images ( *.tif )") );
if( !fileName.isEmpty() )
{
QApplication::setOverrideCursor( QCursor( Qt::WaitCursor ) );
pixmapWidget->setPixmap( fileName );
QString dataFileName = fileName.replace( fileName.length() - 3, 3, "csv" );
QFile data( dataFileName );
if( !data.open(QIODevice::ReadOnly|QIODevice::Text) )
{
QMessageBox::warning( this, "NoCSV file founs!",
QString( "No %1 file was found!" ).arg( dataFileName ) );
}
QTextStream text( &data );
text.setCodec( "UTF-8" );
QString dataString = text.readAll();
( (QStandardItemModel*)fileWidget->model() )->clear();
fileWidget->AddRowsFromString( dataString );
fileWidget->setOutputFile( dataFileName );
data.close();
QApplication::restoreOverrideCursor();
}
}
class CFileWidget : public QTableView
{
Q_OBJECT
public:
CFileWidget(QWidget *parent);
~CFileWidget();
void setOutputFile( const QString fileName )
{ outputFile.setFileName(fileName);
outputFile.open(QIODevice::WriteOnly|QIODevice::Text); }
public slots:
void AddRowsFromString( const QString& text );
void DeleteSelectedRows();
void AddRow();
void SaveToFile();
signals:
void SelectRects( const QList<QRect>& rects, const QList<QRect>& parenRects );
protected slots:
void selectionChanged ( const QItemSelection & selected, const QItemSelection & deselected );
private:
int addonId;
QFile outputFile;
};
void CFileWidget::SaveToFile()
{
QTextStream textStream( &outputFile );
textStream.setCodec( "UTF-8" );
for( int row = 0; row < ( (QStandardItemModel*)model() )->rowCount(); ++row )
{
int column = 0;
while( ( (QStandardItemModel*)model() )->item( row, column ) )
{
textStream<<( (QStandardItemModel*)model() )->item( row, column )->data( Qt::DisplayRole ).toString();
textStream<<"\t";
column++;
}
textStream<<"\n";
}
}