• 5960阅读
  • 12回复

[提问]为什么取出来的是乱码? [复制链接]

上一主题 下一主题
离线溟阡
 
只看楼主 倒序阅读 楼主  发表于: 2009-03-03
— 本帖被 XChinux 从 Qt基础编程 移动到本区(2013-04-01) —
//Test.h
typedef struct {
    char *dir;
    char *name;
} TestStr;

class Test: public QWidget {
Q_OBJECT
public:
    Test(QWidget* parent = 0);

private:
    QList<TestStr> list;
    QPushButton* button[10];
    void init();

public slots:
    void browse();
};


//Test.cpp
Test::Test(QWidget* parent) :
    QWidget(parent) {
    // TODO Auto-generated constructor stub
    TestStr sp;
    char name[] = "INPUT_File_Name";
    sp.name = name;
    char dir[] = "/root/Desktop";
    sp.dir = dir;

    TestStr sp1;
    char name1[] = "OUTPUT_File_Name";
    sp1.name = name1;
    char dir1[] = "/root/Desktop";
    sp1.dir = dir1;

    list.append(sp);
    list.append(sp1);                     //初始化这个list

    init();
}
void Test::init() {
    QHBoxLayout* layout = new QHBoxLayout;
    int sum = list.size();

    for (int i = 0; i < sum; i++) {
        TestStr ts = list.at(i);
        QString str = ts.name;
        qDebug() << str;
        button = new QPushButton(str);
        QString temp;
        temp = QString::number(i, 10);
        button->setAccessibleName(temp);
        connect(button, SIGNAL(clicked()),this, SLOT(browse()));
        layout->addWidget(button);
    }

    setLayout(layout);                           //运行后这个界面显示正确,list的里的东西也能读出来
}

void Test::browse() {

    QPushButton* clickBtn = qobject_cast<QPushButton*> (sender());
    QString str = clickBtn->accessibleName();
    bool ok;
    int i = str.toInt(&ok, 10);
    QString dir = list.at(i).dir;
    QString filePath = QFileDialog::getExistingDirectory(this, "test", dir);            
//点击按钮后,弹出的文件选择中的默认路径不对,这里读到的list中的那个dir是乱码
}

int main(int argc, char *argv[]) {
    QApplication app(argc, argv);

    QTextCodec::setCodecForCStrings(QTextCodec::codecForName("ISO-8859-1"));
    QTextCodec::setCodecForLocale(QTextCodec::codecForName("ISO-8859-1"));
    QTextCodec::setCodecForTr(QTextCodec::codecForName("ISO-8859-1"));
    Test test;
    test.show();

    return app.exec();
}
代码都在这了,麻烦高手帮忙看看 Test.cpp (2 K) 下载次数:3 Test.h (1 K) 下载次数:2 main.cpp (1 K) 下载次数:3   
[ 此帖被溟阡在2009-03-04 14:36重新编辑 ]
离线eric_zh
只看该作者 1楼 发表于: 2009-03-04
用QString::fromLocal8Bit(list.at(i).dir)试试
离线溟阡
只看该作者 2楼 发表于: 2009-03-04
还是不行啊……依然是乱码
离线80486

只看该作者 3楼 发表于: 2009-03-04
QTextCodec::setCodecForCString();
QTextCodec::setCodecForTr();
离线溟阡
只看该作者 4楼 发表于: 2009-03-04
这些都写过了,而且我的程序里没有中文,而且是在一个文件中
离线80486

只看该作者 5楼 发表于: 2009-03-04
把main贴出来看看
离线溟阡
只看该作者 6楼 发表于: 2009-03-04
代码都贴了,可以下载
离线80486

只看该作者 7楼 发表于: 2009-03-04
    QApplication app(argc, argv);

    QTextCodec::setCodecForCStrings(QTextCodec::codecForName("GB2312"));
    QTextCodec::setCodecForLocale(QTextCodec::codecForName("GB2312"));
    QTextCodec::setCodecForTr(QTextCodec::codecForName("GB2312"));
离线wd007

只看该作者 8楼 发表于: 2009-03-04
也许跟代码没有关系了。楼上几位的解答,我觉得差不多把代码解决了。

你的操作系统的默认编码是什么。在win上的话,跟界面风格的设置有时也有关系。

还有如果你用的是IDE的话,它的默认编码是什么。

都改成一致的试试,比如都是GB18030,或utf-8
欢迎访问我的博客,一起学习提高
http://blog.csdn.net/qter_wd007
离线溟阡
只看该作者 9楼 发表于: 2009-03-05
我在linux下 用的eclipse
编码是一致的

更何况我那是在一个cpp中啊,在init()中打印出的就是正常的,在browse()中打印出的就是乱码
只看该作者 10楼 发表于: 2009-03-05
根本不是编码问题

Test::Test(QWidget* parent) :
    QWidget(parent) {
    // TODO Auto-generated constructor stub
    TestStr sp;
    char name[] = "INPUT_File_Name";
    sp.name = name;
    char dir[] = "/root/Desktop";
    sp.dir = dir;

    TestStr sp1;
    char name1[] = "OUTPUT_File_Name";             <<<<
    sp1.name = name1;                                  这两个char数组在你构造函数退出时就没了,不乱码才怪了,你显示出的乱码时内存里不知道什么地方的随机内容
    char dir1[] = "/root/Desktop";                                  <<<<
    sp1.dir = dir1;

    list.append(sp);
    list.append(sp1);                     //初始化这个list

    init();
}
离线浪漫天使
只看该作者 11楼 发表于: 2009-03-05
把char* 当成 int 就直接=了
知道有strcpy的吧。
离线溟阡
只看该作者 12楼 发表于: 2009-03-05
原来如此!
init()在构造函数里调用了,所以不会出乱码
而browse()是点了按钮后才会调用到的,所以会出乱码
那有什么方法可以避免这个问题么?
快速回复
限100 字节
 
上一个 下一个