用Qt 4打开一个txt的文件并导入表格中,为什么重新打开或打开别的txt文件就出错?
请教各位高手:
问题说明:有一个文本文件(test.txt)里面是一行是一条记录
我需要把所有的记录读到一个表里
我用Qt 4的Designer 设计了一个主界面并在上面画了个QTableWidget 控件,生成一个ui文件(opentext.ui),
运用的编译器是VS.net2003的c++编译器
但是我现在的问题是能够读入,但是当重新读入时或读入其他的txt文件时就出错了,请问问题在哪儿?
下面是部分代码:
//opentext.h
#ifndef OPENTEXT_H
#define OPENTEXT_H
#include <QMainWindow>
#include <QTableWidgetItem>
#include <QTableWidget>
#include "ui_opentext.h"
class OpenText : public QMainWindow, public Ui::OpenText
{
Q_OBJECT
public:
OpenText(QWidget *parent = 0);
bool readFile(const QString &fileName);
bool moveFile(const QString &fileName);
bool loadFile(const QString &fileName);
void clear(QTableWidget *,int ,int);
private slots:
void open();
bool save();
void about();
private:
void createActions();
bool saveFile(const QString &fileName);
bool okToContinue();
void setCurrentFile(const QString &fileName);
QString strippedName(const QString &fullFileName);
QString curFile;
};
#endif
//opentext.cpp
#include <QtGui>
#include "opentext.h"
#include <QTextStream>
#include <QStringList>
OpenText::OpenText(QWidget *parent)
: QMainWindow(parent)
{
setupUi(this);//初始化主界面
createActions();
clear(opentable,100,14);
setCurrentFile("");
}
void OpenText::createActions()
{
OpenAction->setShortcut(tr("Ctrl+O"));
OpenAction->setStatusTip(tr("Open an existing txt file"));
connect(OpenAction, SIGNAL(triggered()), this, SLOT(open()));
SaveAction->setShortcut(tr("Ctrl+S"));
SaveAction->setStatusTip(tr("Save the txt to disk"));
connect(SaveAction, SIGNAL(triggered()), this, SLOT(save()));
AboutAction->setStatusTip(tr("Show the application's About box"));
connect(AboutAction, SIGNAL(triggered()), this, SLOT(about()));
}
bool OpenText::readFile(const QString &fileName)
{ //读入文件
QFile file(fileName);
if (!file.open(QIODevice::ReadOnly))
{
QMessageBox::warning(this, tr("OpenText"),
tr("Cannot read file %1:\n%2.")
.arg(file.fileName())
.arg(file.errorString()));
return false;
}
QTextStream in(&file);
int row=0;
int clm=0;
// clear(opentable);
while (!in.atEnd())
{
QString strLineText = in.readLine();
QStringList list1 = strLineText.split(QRegExp("\\s+"),QString::SkipEmptyParts);//以空格为基础拆分字符串
QTableWidgetItem *newItem=new QTableWidgetItem[list1.size()];
if(list1.size()>clm&&list1.size()<=14)
{//保存最大列
clm=list1.size();
}
else if(list1.size()>14)
{
clm=14;
}
opentable->setRowCount(row+1);
for(int column=0;column<list1.size();column++)
{
opentable->setItem(row, column, &newItem[column]);
newItem[column].setText(list1.value(column));
}
++row;
}
file.close();
return true;
}
bool OpenText::okToContinue()
{
if (false/*filechanged(opentable)*/)
{
int r = QMessageBox::warning(this, tr("text file"),
tr("The document has been modified.\n "
"Do you want to save your changes?"),
QMessageBox::Yes | QMessageBox::Default,
QMessageBox::No,
QMessageBox::Cancel | QMessageBox::Escape);
if (r == QMessageBox::Yes) {
return save();
} else if (r == QMessageBox::Cancel) {
return false;
}
}
return true;
}
void OpenText::open()
{
if (okToContinue()) {
QString fileName = QFileDialog::getOpenFileName(this,
tr("Open Text File"), ".",
tr("txt files (*.txt)"));
if (!fileName.isEmpty())
loadFile(fileName);
}
}
bool OpenText::save()
{
/*
if (fileName.isEmpty()) {
return saveAs();
} else {
return saveFile(fileName);
}
*/
return true;
}
bool OpenText::loadFile(const QString &fileName)
{
if (!readFile(fileName)) {
statusBar()->showMessage(tr("Loading canceled"), 2000);
return false;
}
setCurrentFile(fileName);
statusBar()->showMessage(tr("File loaded"), 2000);
return true;
}
void OpenText::clear(QTableWidget *table,int row,int clm)
{
table->setRowCount(0); //此行出错
table->setColumnCount(0);
table->setColumnCount(clm);
table->setRowCount(row);
QString filetext[14]={"Number","ID","price","column4","column5","column6","column7","column8","column9","column10","column11","column12","column13","column14"};
for (int i = 0; i < 14; ++i) {
QTableWidgetItem *item = new QTableWidgetItem;
item->setText(filetext);
table->setHorizontalHeaderItem(i, item);
}
opentable->setCurrentCell(0, 0);
}
void OpenText::setCurrentFile(const QString &fileName)
{
curFile = fileName;
setWindowModified(false);
QString shownName = "Untitled";
if (!curFile.isEmpty()) {
shownName = strippedName(curFile);
}
setWindowTitle(tr("%1[*] - %2").arg(shownName)
.arg(tr("OpenText")));
}
QString OpenText::strippedName(const QString &fullFileName)
{
return QFileInfo(fullFileName).fileName();
}
void OpenText::about()
{
QMessageBox::about(this, tr("About OpenText"),
tr("<h2>OpenText 1.1</h2>"
"<p>Copyright © 2008 Software Inc."
"<p>OpenText is a small application that "
"demonstrates QAction, QMainWindow, QMenuBar, "
"QStatusBar, QTableWidget, QToolBar, and many other "
"Qt classes."));
}