• 11009阅读
  • 11回复

QT写如文本文件没反应。。。。? [复制链接]

上一主题 下一主题
离线sd菜
 
只看楼主 倒序阅读 楼主  发表于: 2010-10-31
— 本帖被 XChinux 执行加亮操作(2010-10-31) —
请教啊。。。我有个函数,和一个按钮想关联的,点击后将一些内容写入文本文件,代码如下: 
  QTextCodec *codec=QTextCodec::codecForName("unicode");//支持中文显示
    QString str=QDateTime::currentDateTime().toString();
    QFile file("myrcd.txt");
    if(!file.open(/*QIODevice::WriteOnly||*/QIODevice::Append))
    {
        QTextStream out(&file);
        out.setCodec(codec);
        out<<str<<"\t"<<"答对了"<<p<<"道题,得分"<<p*10<<endl;
    }
    file.close();
现在的问题是,点击后在到另一个窗口读取文件,没有反应,,,,,还是之前我加进去的内容,意思就是没写进去,求解。。。。
离线XChinux

只看该作者 1楼 发表于: 2010-10-31
1、为什么用unicode?那中文能写进去吗?
2、file变量的作用域最好先结束。
二笔 openSUSE Vim N9 BB10 XChinux@163.com 网易博客 腾讯微博
承接C++/Qt、Qt UI界面、PHP及预算报销系统开发业务
离线dbzhang800

只看该作者 2楼 发表于: 2010-10-31
估计楼主是乱试的。

就这个用法
{{{
out<<str<<"\t"<<"答对了"<<p<<"道题,得分
}}}
codecs 设成什么都没用。
离线benbenmajia

只看该作者 3楼 发表于: 2010-11-01
把codec设置成GBK
安然.....
离线dbzhang800

只看该作者 4楼 发表于: 2010-11-01
最主要的是中文这么有问题

out<<str<<"\t"<<"答对了"<<

要想输出的文件是对的,QTextStream 的 codecs 只能设置为 latin1。也就是连错两次结果就对了(数学中的负负为正?)
离线sd菜
只看该作者 5楼 发表于: 2010-11-01
回 1楼(XChinux) 的帖子
因为WIN7下的记事本的字符编码格式就是unicode类型的,我读文件的时候也是这个编码类型,能读出来的啊
离线sd菜
只看该作者 6楼 发表于: 2010-11-01
回 2楼(dbzhang800) 的帖子
我找了很久都没找到怎么把字符串写进文本文件里面(尴尬。。。),我在QT help文档里面看到:QTextStream out(stdout);
out << "Qt rocks!" << endl;
我就直接把字符串添加进去了,也不知道对不对,但是后来我把str去掉了,代码为:
QTextStream out(&file);
        out.setCodec(codec);
        out<<"QTQTQTQTQT"<<endl;
        file.close();
还是写不进去
离线dbzhang800

只看该作者 7楼 发表于: 2010-11-02
Re:回 2楼(dbzhang800) 的帖子
引用第6楼sd菜于2010-11-01 20:11发表的 回 2楼(dbzhang800) 的帖子 :
我找了很久都没找到怎么把字符串写进文本文件里面(尴尬。。。),我在QT help文档里面看到:QTextStream out(stdout);
out << "Qt rocks!" << endl;
我就直接把字符串添加进去了,也不知道对不对,但是后来我把str去掉了,代码为:
QTextStream out(&file);
        out.setCodec(codec);
.......

不妨 贴个10行左右(最好不要超过20行)的完整的程序来重现你的问题
离线foxyz

只看该作者 8楼 发表于: 2010-11-02
楼主试试这个:

QFile data("output.txt");
if (data.open(QFile::WriteOnly | QFile::Truncate)) { //不要用apend,因为apend表示该文件已经存在。
     QTextStream out(&data);
     out<<str<<"\t"<<"答对了\n";  //不要用endl,endl是std的functor,
}
data.close();
离线sd菜
只看该作者 9楼 发表于: 2010-11-02
呃。。。。谢谢各位,问题已经解决了,,,,有三个问题
第一(最重要的!!):if(!file.open(/*QIODevice::WriteOnly||*/QIODevice::Append))
这句代码中应该去掉“!”,我看了好久,纠结死了!!!,非就是打开文件失败时才进if,我恰恰弄反了!!怪不得一直写不进文件!!
第二:if(!file.open(/*QIODevice::WriteOnly||*/QIODevice::Append))
里面的QIODevice::WriteOnly不应该加注释,Open中必须指定ReadOnly, WriteOnly, ReadWrite其中之一,否则不能打开,修改如下:
if(file.open(QIODevice::WriteOnly|QIODevice::Append|QIODevice::Text))
第三: out<<str<<"\t"<<"答对了"<<p<<"道题,得分"<<p*10<<endl;
这句也有问题,要显示中文,这个格式不对(虽然已经设置了编码格式),这个显示的是乱码!正确的代码是:
out<<str<<"\n"<<tr("答对了%1").arg(p)+tr("道题,得分%2").arg(p*10)<<endl;
也就是说只有在tr("")里面写中文时它才会认的!!!
离线dbzhang800

只看该作者 10楼 发表于: 2010-11-02
用tr可以得到正确结果,但这么用严格说应该是不正确(至少是不恰当)的,正确的应该是用 QString

当然,如果你确实是打算在它基础上进行国际化,用tr是合适的。
离线201021010623
只看该作者 11楼 发表于: 2011-04-22
#include <QtGui>
#include <mymainwindow.h>

mymainwindow::mymainwindow()
{
    setWindowTitle("key choice");
    setGeometry(100,100,610,520);

   mymain=new QWidget(this);
   mymain->resize(600,510);

   b1=new QPushButton("1",mymain);
   b1->setGeometry(10,30,100,40);
   b1->setFont(QFont("Times",18,QFont::Bold));

   b2=new QPushButton("2",mymain);
   b2->setGeometry(10,80,100,40);
   b2->setFont(QFont("Times",18,QFont::Bold));

   b3=new QPushButton("3",mymain);
   b3->setGeometry(10,130,100,40);
   b3->setFont(QFont("Times",18,QFont::Bold));

   b4=new QPushButton("4",mymain);
   b4->setGeometry(10,180,100,40);
   b4->setFont(QFont("Times",18,QFont::Bold));

   b5=new QPushButton("5",mymain);
   b5->setGeometry(10,230,100,40);
   b5->setFont(QFont("Times",18,QFont::Bold));

   b6=new QPushButton("6",mymain);
   b6->setGeometry(10,280,100,40);
   b6->setFont(QFont("Times",18,QFont::Bold));

   b7=new QPushButton("7",mymain);
   b7->setGeometry(10,330,100,40);
   b7->setFont(QFont("Times",18,QFont::Bold));

   b8=new QPushButton("8",mymain);
   b8->setGeometry(10,380,100,40);
   b8->setFont(QFont("Times",18,QFont::Bold));

   b9=new QPushButton("9",mymain);
   b9->setGeometry(10,430,100,40);
   b9->setFont(QFont("Times",18,QFont::Bold));

   tedit=new Q3MultiLineEdit(mymain);
   tedit->setGeometry(120,0,500,500);

   addChild(mymain);

   connect(b1,SIGNAL(clicked()),this,SLOT(mydisplay1()));
   connect(b2,SIGNAL(clicked()),this,SLOT(mydisplay2()));
   connect(b3,SIGNAL(clicked()),this,SLOT(mydisplay3()));
   connect(b4,SIGNAL(clicked()),this,SLOT(mydisplay4()));
   connect(b5,SIGNAL(clicked()),this,SLOT(mydisplay5()));
   connect(b6,SIGNAL(clicked()),this,SLOT(mydisplay6()));
   connect(b7,SIGNAL(clicked()),this,SLOT(mydisplay7()));
   connect(b8,SIGNAL(clicked()),this,SLOT(mydisplay8()));
   connect(b9,SIGNAL(clicked()),this,SLOT(mydisplay9()));

}
void mymainwindow::mydisplay1()
{
    tedit=new Q3MultiLineEdit(mymain);
    tedit->setGeometry(120,0,500,500);
    tedit->setReadOnly(true);

    QFile myfile("e:/mymainwindow/1.tex");
    myfile.open(IO_ReadOnly);
    QTextStream mystream(&myfile);
    QString mystring;
    while(mystream.atEnd()==0)
    {
        mystring=mystream.readLine();
        tedit->insertLine(mystring);
    }
    myfile.close();
}

void mymainwindow::mydisplay2()
{
    tedit=new Q3MultiLineEdit(mymain);
    tedit->setGeometry(120,0,500,500);
    tedit->setText("This is the second choice of text.");
    tedit->show();
}

void mymainwindow::mydisplay3()
{
    tedit=new Q3MultiLineEdit(mymain);
    tedit->setGeometry(120,0,500,500);
    tedit->setText("This is the third choice of text.");
    tedit->show();
}

void mymainwindow::mydisplay4()
{
    tedit=new Q3MultiLineEdit(mymain);
    tedit->setGeometry(120,0,500,500);
    tedit->setText("This is the fourth choice of text.");
    tedit->show();
}

void mymainwindow::mydisplay5()
{
    tedit=new Q3MultiLineEdit(mymain);
    tedit->setGeometry(120,0,500,500);
    tedit->setText("This is the fifth choice of text.");
    tedit->show();
}

void mymainwindow::mydisplay6()
{
    tedit=new Q3MultiLineEdit(mymain);
    tedit->setGeometry(120,0,500,500);
    tedit->setText("This is the sixth choice of text.");
    tedit->show();
}

void mymainwindow::mydisplay7()
{
    tedit=new Q3MultiLineEdit(mymain);
    tedit->setGeometry(120,0,500,500);
    tedit->setText("This is the seventh choice of text.");
    tedit->show();
}

void mymainwindow::mydisplay8()
{
    tedit=new Q3MultiLineEdit(mymain);
    tedit->setGeometry(120,0,500,500);
    tedit->setText("This is the eighth choice of text.");
    tedit->show();
}

void mymainwindow::mydisplay9()
{
    tedit=new Q3MultiLineEdit(mymain);
    tedit->setGeometry(120,0,500,500);
    tedit->setText("This is the ninth choice of text.");
    tedit->show();
}

按按钮1没反应




但是单独的程序#include <QApplication>
#include <QWidget>
#include <QFile>
#include <QTextStream>
#include <QString>
#include <Qt3Support/Q3MultiLineEdit>

class twelve1:public QWidget
{
public:
   twelve1();
private:
   Q3MultiLineEdit *medit;
};

twelve1::twelve1()
{
setGeometry(100,100,480,400);

medit=new Q3MultiLineEdit(this);
medit->setGeometry(10,10,460,380);
medit->setReadOnly(true);

  QFile myfile("e:/mymainwindow/1.txt");//文件的路径

myfile.open(IO_ReadOnly);//设置为只读模式

QTextStream mystream(&myfile);//这个对象从文件中读取文本

QString mystring;

while(mystream.atEnd()==0)//从文件中读取一行,并将它输出到QMultiLineEdit对象。
{
   mystring=mystream.readLine();//readline()每次只读一行,而read()读取整个流

   medit->insertLine(mystring);

}

myfile.close();

}

void main(int argc,char **argv)
{
   QApplication a(argc,argv);
   twelve1 w;
   w.show();
   a.exec();
}


可以显示。txt中的内容,为什么跟按钮在一起了就没用
快速回复
限100 字节
 
上一个 下一个