莫非 发表于 2005-11-25 23:51:25

问一个MAGIC下QT编程出现中文乱码的问题。

if(temp.at(0)=='0')
    {
        QMessageBox::warning( this, "Application name",
                              "第一个数字不能为零.\n"
                              "The factory default will be used instead." );
        return;
    }

这个是我程序中的代码,我是用qt设计器中的文本编辑直接写的代码,但是程序运行后弹出的消息框中文为乱码,估计是qt设计器带的 编辑程序用的编码和运行环境不同,请问该怎么解决?

mandrakechina 发表于 2005-11-26 00:13:07

程序源代码中不能有中文。KDE要出中文必须使用i18n(),Qt要出中文好像是Qs之类的函数。

KanKer 发表于 2005-11-26 01:05:08

qt 中文字符串可用 trUtf8()
不过你这种不需要国际化的情况,用 QString::fromLocal8Bit() 更方便些。

tingxx 发表于 2005-11-26 08:54:13

不需要国际化的话,直接让程序的默认编码为gbk之类应该可以了

KanKer 发表于 2005-11-26 09:45:28

楼上正解。

莫非 发表于 2005-11-26 12:11:52

以前用红旗的时候我直接在里面用中文,程序可以正常显示中文。

请教tingxx兄,怎么改程序的默认编码?怎么查看各个环境的中文编码?比方qt的,kate的,程序运行环境的等等

mandrakechina 发表于 2005-11-26 12:52:51

红旗的Qt和其它发行版的Qt大部分不兼容,在红旗上开发的程序很少有可以不加修改直接在其它发行版上编译运行的。

或者更加确切的说,红旗的Qt和Trolltech的Qt类似于Ubuntu和Debian的关系。每次Trolltech有新的Qt出来,红旗就去fork,加上自己的补丁...

trulyliu 发表于 2005-11-27 11:42:48

QT要进行转换编码,或者使用多语言支持。
这样修改一下。
#include <qstring.h>
#include <qtextcodec.h>

string szTemp = "第一个数字不能为零“;
//要看你的编辑状态编码环境,如果是UTF-8,就写UTF8
QTextCodec *ptextcodec = QTextCodec::CodeForName("GBK");

QString szqtext = ptextcodec->toUnicode(szTemp.c_str(), szTemp.size());


if(temp.at(0)=='0')
{
QMessageBox::warning( this, "Application name",
szqtext,
"The factory default will be used instead." );
return;
}


这样应该就可以了。。

这是用转换编码的方式作的,你可以自己尝试一下用QTranslator来做多语言支持。。。

tingxx 发表于 2005-11-27 12:42:58


请教tingxx兄,怎么改程序的默认编码?怎么查看各个环境的中文编码?比方qt的,kate的,程序运行环境的等等

Another use of QTextCodecs is to specify the encoding of strings that occur in
the source code. Let’s consider the example of a team of Japanese program-
mers who are writing an application targeted primarily at Japan’s home mar-
ket. These programmers are likely to write their source code in a text editor
that uses an encoding such as EUC-JP or Shift-JIS. Such an editor allows
them to type in Japanese characters seamlessly, so that they can write code
like this:
   QPushButton *button = new QPushButton(tr("xxx"), 0);
By default, Qt interprets arguments to tr() as Latin-1. To change this, call the
QTextCodec::setCodecForTr() static function. For example:
   QTextCodec *japaneseCodec = QTextCodec::codecForName("EUC-JP");
   QTextCodec::setCodecForTr(japaneseCodec);
This must be done before the first call to tr(). Typically, we would do this in
main(), right after the QApplication object is created.

tingxx 发表于 2005-11-27 12:44:10

楼主读读
《C++ GUI Programming
   with Qt 3》
这本书吧,我正在学习中.... :mrgreen:

trulyliu 发表于 2005-11-27 13:00:37

有这本书的电子版吗?
给我一个,谢谢。。

莫非 发表于 2005-11-27 14:11:48

谢谢大家对我的帮助,我正学习QT编程,以后有问题请多多指教。

someone_dead 发表于 2005-11-27 16:23:32

我也在学qt。大家多多交流下哈

tingxx 发表于 2005-11-27 17:23:24

书在
http://www.magiclinux.org/people/tingxx/dev-book/blanchette_book.pdf

我刚在google上建了一个QT的邮件 列表。希望有学习QT的志同道合者加入,大家交流交流,少起弯路:)

名字是 QT-learner

tingxx 发表于 2005-11-27 17:47:29

在QT中可以直接QTextCodec来转换字符串的编码,这为在QT下开发中文软件带来了便利条件,不过这种方法不符合国际化/本地化的标准:
char *string = "你好,世界!";
QTextCodec *codec = QTextCodec::codecByName("GBK");
//QTextCodec *codec = QTextCodec::codecByName("Big5");
QString strText = codec->toUnicode(string);
QLabel *label = new QLabel(strText);

最直接的方法是把整个应用程序的编码设置为GBK编码,然后在字符串这前加tr:
qApp->setDefaultCodec( QTextCodec::codecForName("GBK") );
...
QLabel *label = new QLabel(tr("你好,世界!"));
例:
#include <qapplication.h>
#include <qlabel.h>

int main( int argc, char *argv[] )
{
    QApplication app( argc, argv );
   app.setDefaultCodec( QTextCodec::codecForName("GBK") );
    QLabel label(tr("你好,世界!"), NULL);
    app.setMainWidget(&label);
    label.show();
    return app.exec();
}


如果使QT根据Locale的环境变量取得字符集,可以使用如下命令:
QString::fromLocal8Bit("你好,世界!");
例:
#include <qapplication.h>
#include <qlabel.h>

int main( int argc, char *argv[] )
{
    QApplication app( argc, argv );
    QLabel label(QString::fromLocal8Bit("你好,世界!"), NULL);
    app.setMainWidget(&label);
    label.show();
    return app.exec();
}

以上方法开发不符合国际化编程的习惯,如果编写支持多种编码的软件,一定要采用国际化方法。




摘自《linux程序设计》
页: [1] 2
查看完整版本: 问一个MAGIC下QT编程出现中文乱码的问题。