• 4890阅读
  • 8回复

[提问]QString保存内容消失[已解决] [复制链接]

上一主题 下一主题
离线gwboy2004
 
只看楼主 倒序阅读 楼主  发表于: 2011-05-30
通过qdir获取文件夹下文件列表,把文件地址保存到Card的对象里的QString类型的dir里,经测试在setdir里加输出语句能够正常输出,但是程序运行用getdir获取dir里的字符串时错误,内容为空。。。求助啊~~~这是为啥?

#include<QSettings>
#include<iostream>
#include <QDir>
#include<QString>
using namespace std;

class Card
{
public:
    Card()
    {
        x=300;
        y=300;
        dir="\0";
        player=0;
    }

    void SetX(int x_i)
    {
        x=x_i;
    }
    void SetY(int y_i)
    {
        y=y_i;
    }
    void SetPlayer(int player_i)
    {
        player=player_i;
    }
    void SetDir(QString m)
    {
        dir+=new QString (m);
        //dir=( m.unicode(), m.length() );
        //dir=m;
        //cout<<qPrintable(dir);
    }

    int GetX()
    {
        return x;
    }
    int GetY()
    {
        return y;
    }
    QString GetDir()
    {
        cout<<qPrintable(dir);
        cout<<dir.length()<<endl;
        cout<<"test"<<endl;
        return dir;
    }

    int GetPlayer()
    {
        return player;
    }

private:
    int x;
    int y;
    QString dir;
    int player;

};


class CardLoader
{
public:
    CardLoader(int num)            
    {
        num_i=num;
        CreateIdentityCard();      
    }
    ~CardLoader()
    {
        delete []iCard;
    }

    Card *iCard;

    void CreateIdentityCard()
    {
        iCard=new Card[num_i];
        QString path="D:/pic/Identity/";
            QDir dir(path);
             dir.setFilter(QDir::Dirs|QDir::Files);
             dir.setSorting(QDir::DirsFirst);
             QFileInfoList list = dir.entryInfoList();
             for(int i=0;i<num_i;i++)
             {

                 QFileInfo fileInfo = list.at(i);
                 if(fileInfo.fileName()=="."||fileInfo.fileName()=="..")
                 {
                     i++;
                     continue;
                 }
                 QString temp;
                 temp.append(fileInfo.path());
                 temp.append("/");
                 temp.append(fileInfo.fileName());
                 //cout<<qPrintable(QString("%1").arg(temp))<<endl;
                 iCard.SetDir(temp);

             }
       }

       Card* GetIdentityCard()
    {
        return iCard;
    }


private:
    int num_i;
};

int main(int argc, char *argv[])
{
    QCoreApplication a(argc, argv);
    CardLoader CL(5);
    Card *p=CL.GetIdentityCard();
    cout<<p->GetX()<<endl;
    cout<<p->GetY()<<endl;
    cout<<p->GetPlayer()<<endl;

    //cout<<(p+1)->GetX()<<endl;

    cout<<qPrintable(QString("%1").arg((p+1)->GetDir()))<<endl;

    return a.exec();
}

离线jdwx

只看该作者 1楼 发表于: 2011-05-30
别的先不说,先把类分成两个文件.h和.cpp,其它的以后说。
发帖时要说明:操作系统、Qt版本、编译器,这样能更快的得到回复。
离线luoyang

只看该作者 2楼 发表于: 2011-05-31
楼上说的很有道理~~
离线gwboy2004
只看该作者 3楼 发表于: 2011-05-31
//card.h
#ifndef CARD_H
#define CARD_H

#include <QObject>

class Card : public QObject
{
    Q_OBJECT
public:
    explicit Card(QObject *parent = 0);
    void SetX(int x_i);
    void SetY(int y_i);
    void SetPlayer(int player_i);
    void SetDir(QString m);
    int GetX();
    int GetY();
    QString GetDir();
    int GetPlayer();
private:
    int x;
    int y;
    QString dir;
    int player;

signals:

public slots:

};

#endif // CARD_H



//Card.cpp
#include "Card.h"
#include<iostream>
using namespace std;


Card::Card(QObject *parent) :
    QObject(parent)
{
    x=300;
    y=300;
    dir="\0";
    player=0;
}

void Card::SetX(int x_i)
{
    x=x_i;
}
void Card::SetY(int y_i)
{
    y=y_i;
}
void Card::SetPlayer(int player_i)
{
    player=player_i;
}
void Card::SetDir(QString m)
{
    dir+=new QString (m);
    dir.append(m);
   dir=m;
    //dir->append("1234567");
    //cout<<qPrintable(dir);
}

int Card::GetX()
{
    return x;
}
int Card::GetY()
{
    return y;
}
QString Card::GetDir()
{
    cout<<qPrintable(dir);
    cout<<"test"<<dir.length()<<endl;
    return dir;
}

int Card::GetPlayer()
{
    return player;
}


//Cardloader1.h
#ifndef CARDLOADER1_H
#define CARDLOADER1_H
#include<QSettings>
#include<iostream>
#include <QDir>
#include<QString>
#include<QTime>
#include<Card.h>
using namespace std;

#include <QObject>

class CardLoader1 : public QObject
{
    Q_OBJECT
public:
    explicit CardLoader1(QObject *parent = 0);
    CardLoader1();
    CardLoader1(int num);
    ~CardLoader1();

    Card *iCard;

    void CreateIdentityCard();

private:
    int num_i;



signals:

public slots:

};

#endif // CARDLOADER1_H


//cardloader1.cpp
#include "cardloader1.h"

CardLoader1::CardLoader1(QObject *parent) :
    QObject(parent)
{
}
CardLoader1::CardLoader1(int num)             //num传进来玩家数量
{
    num_i=num;
    num_b=num;
    nCard=NULL;
    CreateIdentityCard();       //身份牌初始化

CardLoader1::~CardLoader1()
{
    delete []iCard;

}
void CardLoader1::CreateIdentityCard()
{
    iCard=new Card[num_i];
    QString path="D:/sanguosha/pic/Identity/";
        QDir dir(path);
         dir.setFilter(QDir::Dirs|QDir::Files);
         dir.setSorting(QDir::DirsFirst);
         QFileInfoList list = dir.entryInfoList();
         for(int i=0;i<num_i;i++)
         {

             QFileInfo fileInfo = list.at(i);
             if(fileInfo.fileName()=="."||fileInfo.fileName()=="..")
             {
                 i++;
                 continue;
             }
             QString temp;
             temp.append(fileInfo.path());
             temp.append("/");
             temp.append(fileInfo.fileName());
             //cout<<qPrintable(QString("%1").arg(temp))<<endl;
             iCard.SetDir(temp);

         }
   }
离线jdwx

只看该作者 4楼 发表于: 2011-05-31
还是发代码上来吧,大家一起分析分析!
发帖时要说明:操作系统、Qt版本、编译器,这样能更快的得到回复。
离线gwboy2004
只看该作者 5楼 发表于: 2011-05-31
回 4楼(jdwx) 的帖子
发上来了,简单来说,就是我在一个类(A)的成员函数里创建另一个类(B)的对象,然后从一个qstring复制到B的对象里的一个QString里,但是只要A的这个成员函数结束了B的对象里的Qstring就空白了。。。
离线gwboy2004
只看该作者 6楼 发表于: 2011-05-31
qt.rar (1363 K) 下载次数:2
具体代码我上传了一份。。。谢谢


离线jdwx

只看该作者 7楼 发表于: 2011-05-31
代码没问题,QString也存起来了,关键是你的初始化阶段,每个数组头两个成员是空的,就是 .和..
main.cpp
改成如下就有输出
(p+2)->GetDir();
(q+2)->GetDir();
把初始化改改就好了
发帖时要说明:操作系统、Qt版本、编译器,这样能更快的得到回复。
离线gwboy2004
只看该作者 8楼 发表于: 2011-05-31
回 7楼(jdwx) 的帖子
恩,谢谢。。。、、、
快速回复
限100 字节
 
上一个 下一个