• 10211阅读
  • 3回复

【已解决】用Qt 4打开一个txt的文件并导入表格中,为什么重新打开或打开别的txt文件就出错? [复制链接]

上一主题 下一主题
离线txiejun
 
只看楼主 倒序阅读 楼主  发表于: 2008-08-04
— 本帖被 XChinux 执行加亮操作(2008-08-05) —
请教各位高手:
问题说明:有一个文本文件(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."));
}
[ 此贴被txiejun在2008-08-05 15:06重新编辑 ]
附件: OpenText_Problem.rar (58 K) 下载次数:48
附件: OpenText_solved.rar (29 K) 下载次数:69
三分天注定,七分靠打拼,爱拼才会赢!
离线txiejun
只看该作者 1楼 发表于: 2008-08-04
源代码在附件中,希望各位高手指教一下,我刚接触Qt不久,很多不懂。
三分天注定,七分靠打拼,爱拼才会赢!
离线water_wf

只看该作者 2楼 发表于: 2008-08-04
应该是table 已经是非法指针,跟踪一下卡看那里操作了这个指针
离线txiejun
只看该作者 3楼 发表于: 2008-08-05
谢谢各位了,问题以解决了,哈哈。
据我分析,问题应该出在这儿,由于声明了临时变量,当重新打开时newItem已经不存在了,所以出错,不知道我分析得对不对,望各位高手指点。
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));
        }
下面给出我的解决办法:
重新写了opentext.cpp和opentext..h文件如下
//opentext.cpp
#include <QtGui>

#include "opentext.h"
#include <QTextStream>
#include <QStringList>

OpenText::OpenText(QWidget *parent)
    : QMainWindow(parent)
{
    setupUi(this);//初始化主界面
    createActions();
    setTable(opentable,0,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;
    opentable->setRowCount(0);
    opentable->setColumnCount(0);
    setTable(opentable,0,14);
    while (!in.atEnd())
    {
        QString strLineText = in.readLine();
        QStringList list1 = strLineText.split(QRegExp("\\s+"),QString::SkipEmptyParts);//以空格为基础拆分字符串
        if(list1.size()>clm)
        {//保存最大列
            clm=list1.size();
        }
   
        setTable(opentable,row+1,clm);
        for(int column=0;column<list1.size();column++)
        {
            setFormula(opentable,row, column,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::setTable(QTableWidget *table,int t_row,int t_clm)
{
   
    table->setColumnCount(t_clm);
    table->setRowCount(t_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::setFormula(QTableWidget *table, int row, int column, QString &str)
{
    //QTableWidgetItem *c = cell(table,row, column);
    QTableWidgetItem *c = static_cast<QTableWidgetItem *>(table->item(row, column));
    if (!c) {
        c = new QTableWidgetItem;
        table->setItem(row, column, c);
    }
    c->setText(str);
}

QTableWidgetItem *OpenText::cell(QTableWidget *table,int row, int column) const
{
    return static_cast<QTableWidgetItem *>(table->item(row, column));
}

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."));
}


//opentext..h
#ifndef OPENTEXT_H
#define OPENTEXT_H

#include <QMainWindow>
#include <QTableWidgetItem>
#include <QTableWidget>

//class Cell;
//class QTableWidgetItem;
#include "ui_opentext.h"
class OpenText : public QMainWindow, public Ui::OpenText
{
    Q_OBJECT
public:
    OpenText(QWidget *parent = 0);
    bool readFile(const QString &fileName);
    bool loadFile(const QString &fileName);
    void setTable(QTableWidget *,int ,int);
private slots:
    void open();
    bool save();
    void about();
private:
    void createActions();
    bool saveFile(const QString &fileName);
    void setFormula(QTableWidget *table, int row, int column,QString &str);
    bool okToContinue();
    void setCurrentFile(const QString &fileName);
    QTableWidgetItem *cell(QTableWidget *table,int row, int column) const;
    QString strippedName(const QString &fullFileName);
    QString curFile;
   
};
#endif
三分天注定,七分靠打拼,爱拼才会赢!
快速回复
限100 字节
 
上一个 下一个