• 7422阅读
  • 9回复

非常郁闷,尝试了多种写文件的办法,都没能将文本写入,请大家赐教 [复制链接]

上一主题 下一主题
离线airsun321
 
只看楼主 倒序阅读 楼主  发表于: 2008-11-16
— 本帖被 XChinux 执行加亮操作(2008-11-30) —
大家好,小弟是Qt的菜鸟一只,目前想在程序里实现一个对文本文件写入的功能,思路是,先建立一个txt文件,接着用TextEdit类建立一个窗口,可以通过键盘写入字符,写入的字符应该存入txt文档里。关闭TextEdit的窗口后,打开txt文档,期望可以看到在窗口中键入过的字符。尝试了几种办法,基本是从Qt的Assistant里找的,结果虽然编译通过,可是执行后却没有对txt文件写入任何字符。具体代码如下:

方法一://这是仿照Assistant的QFile Class里代码
QFile myFile ("source.txt");

if ( myFile.open( IO_WriteOnly ) ) {
        QTextStream stream( &myFile );
        QStringList lines;
        for ( QStringList::Iterator it = lines.begin(); it != lines.end(); ++it )
            stream << *it << "\n";
        myFile.close();
    }

方法二://这是仿照Qt Assistant 的QTextEdit Class里代码
medit = new QTextEdit (this);
QFile myFile ("source.txt");

if  (myFile.open(IO_WriteOnly )) {
   
    //Creat a text stream for the Qfile object
    QTextStream mystream (&myFile);
   
    mystream << medit->text();
    medit->setModified(FALSE );
    myFile.close();
}

主要就是上述两种方法,我参看了Qt自带的Example文件夹里的一些例子,比如MDI、Recentfiles,都和我的第二种方法一样,我在运行程序后,首先在弹出的TextEditor里随便通过键盘键入几个字符,然后关闭窗口,接着打开source.txt,可是txt文档里却什么字符都没有。程序改了很多遍,都没有结果,十分郁闷,请各位朋友给些建议,到底是我的编程思路一开始就错了,还是我的代码有问题。非常感谢!
离线vrcats
只看该作者 1楼 发表于: 2008-11-17
至少第一种方法没问题。确认你对当前目录有写权限:

#include <QtGui>
#include <QApplication>
#include <QDebug>

int
main (int argc, char **argv)
{
  QApplication app (argc, argv);
  QWidget widget;
  QFile myFile ("source.txt");
  if (myFile.open (QIODevice::WriteOnly))
    {
      QTextStream stream (&myFile);
      QStringList lines;
      lines << "abc" << "bcd";
      for (QStringList::Iterator it = lines.begin (); it != lines.end ();
          ++it)
        stream << *it << "\n";
      myFile.close ();
    }
  widget.show ();
  return app.exec ();
}
离线water_wf

只看该作者 2楼 发表于: 2008-11-17
调试一下就行了,确定代码被执行了
离线cunyoulu
只看该作者 3楼 发表于: 2008-11-17
调试一下,看看问题出在什么地方。
村友录-让您的村落名扬天下http://www.cunyoulu.com
离线airsun321
只看该作者 4楼 发表于: 2008-11-17
To vrcats,
第一种方法,我开始的时候没加上您写的那句 lines<<"abc"<<"bcd" ,加上之后,的确在txt文档里存入了abc和bcd两行字符,但我期望的是当我在textedit里用键盘输入时,显示在textedit窗口里的字符同时就被存入soruce.txt的文档里了。您有什么办法么?

To water_wf,
我的两种方法代码都编译通过了,可就是不能实现我所希望的,在textedit里用键盘输入时,显示在textedit窗口里的字符同时就被存入soruce.txt的文档里了。
离线叹叹想
只看该作者 5楼 发表于: 2008-11-17
第二种方法,你在运行后,弹出的textedit中最初并没有任何内容,程序在执行mystream << medit->text();这条语句的时候textedit没有内容,所以文件为空。当你之后编辑输入内容的时候,你并没有写程序来实现你输入内容之后,加写入的内容加入到文件中。
这里应该加入信号和槽,也就是你输出内容的同时,QTextEdit发出textChanged()的信号,你应该写一个槽函数textChangedSlot(),在这个函数中完成写文件的操作。然后将textChanged()信号和这个槽连接。这样,每次你编辑内容发生变化的时候,textChanged()信号发出,触发槽,开始写文件。

下面是实现代码
1.main.cpp
#include "mw.h"
#include <qapplication.h>
int main( int argc, char **argv )
{
        QApplication a(argc,argv);
        Medit *medit = new Medit();
        a.setMainWidget(medit);
        medit->show();
        return a.exec();
}
2.mw.h
#include <qtextedit.h>
class Medit;
                                                                                             
class Medit : public QTextEdit
{
        Q_OBJECT
        public:
                Medit( QWidget * parent = 0, const char * name = 0 );
                ~Medit();
                                                                                             
        protected slots:
                void textChangedSlot();
};
3.mw.cpp
#include <qfile.h>
#include <qtextstream.h>
#include "mw.h"
                                                                                                                     
Medit::Medit( QWidget *parent, const char *name)
        :QTextEdit(parent,name)
{
        connect( this,SIGNAL( textChanged() ),
                this,SLOT( textChangedSlot() ) ) ;
}
                                                                                                                     
Medit::~Medit()
{
}
                                                                                                                     
//protected slots
void Medit::textChangedSlot()
{
        QFile myFile ("source.txt");
                                                                                                                     
        if  (myFile.open(IO_WriteOnly ))
        {
                //Creat a text stream for the Qfile object
                QTextStream mystream (&myFile);
                mystream << this->text();
                this->setModified(FALSE );
        }
        myFile.close();
}
我测试过了,希望对你有帮助
离线nliuser
只看该作者 6楼 发表于: 2008-11-17
void textChanged ( const QString & )
试试这个信号
离线vrcats
只看该作者 7楼 发表于: 2008-11-18
输入一个字符就存一次有点太浪费了,你可以让textedit失去焦点的时候才保存文件,方法是重写
virtual void focusOutEvent ( QFocusEvent * event )
在里面取得textedit的内容然后按照示例的方法做
离线airsun321
只看该作者 8楼 发表于: 2008-11-18
看到这么多回复,真的很感谢大家!

To 叹叹想,
您的代码我试验过了,没问题!非常感谢!这里想再请教您一个问题,当我想把您写的mw.h,mw.cpp, main.cpp放在一个文件里(比如test.cpp)时,编译的时候报错:/test.cpp:27: undefined reference to `vtable for Medit',
第27行的是如下代码:
Medit::~Medit()
{
}
请问这是为什么?我必须把三段代码放在三个不同文件里吗?如果希望放在同一cpp文件中,我该如何处理?

To vrcats,
您的建议我会学习,现在我正实现基本功能,等基本功能实现了,再把您建议的函数加进去。谢谢!
离线vrcats
只看该作者 9楼 发表于: 2008-11-18
您介忒客气了啊,哈哈
快速回复
限100 字节
 
上一个 下一个