2010-07-12 63 views
1

我创建了一个.exe文件并将.myFile扩展名关联到该.exe文件。我想双击任何.myFile文件,并通过.exe打开该文件。对于我也做了以下内容:如何打开一个具有unicode符号名称的文件

int main(int argc, char *argv[]) 
{ 
    QString fileName(QObject::tr(argv[1])); 
    if (fileName != "") 
    { 
     mainWin.loadFile(fileName); 
    } 
.................. 
} 

但是,当我有一个名为我的Unicode字符(如“Здравствуй.myFile”)的文件中,而不是“Здравствуй”你可以看到“?????? ??”。如何解决这个问题呢?我知道这是解决问题的原因,例如,MS Word就是这样做的。

+0

OT。但QObject :: tr()用于UI文本的翻译。除非你打算用翻译后的名字打开这个文件,否则你不应该在这里使用tr()。 – 2010-07-12 17:48:45

回答

8

以前的答案集中在int main(int argc, char** argv)是不必要的复杂。 Qt有更好的选择。

从Qt文档:On Windows, the QApplication::arguments() are not built from the contents of argv/argc, as the content does not support Unicode. Instead, the arguments() are constructed from the return value of GetCommandLine().

所以,正确的答案是使用qApp.arguments().at(1),这将给你在为QString Unicode的文件名。

+0

我应该传递给QApplication构造函数以便能够调用您提到的函数。 – Narek 2010-07-12 09:37:53

+0

什么是qApp?我在哪里构建或得到它? – Narek 2010-07-12 09:47:54

+0

请参阅http://doc.qt.nokia.com/4.6/qapplication.html#qApp:所有Qt应用程序都应该有该宏。你应该从main传递正常的argc/argv。它们在Windows上被忽略,但它保持您的程序可移植到Mac和Linux – MSalters 2010-07-12 09:56:55

1

你必须在Windows上使用wmain,而不是main

int wmain(int argc, wchar_t** argv) { 
    QString fileName = QString::fromWCharArray(argv[1]); // untested 

如果你必须遵循C标准(这是在Windows上的所有,但没用),你可以使用GetCommandLineWCommandLineToArgvW代替。

+0

如果您说如何将wchar_t ** argv转换为char ** argvCHAR,那么我可以将它传递给QApplication构造函数。 – Narek 2010-07-12 08:37:44

+0

使用MSalters的解决方案。 'QApplication'做正确的事情。 – Philipp 2010-07-12 12:33:48

0

假设你通过在Unicode实际存储为UTF-8,请尝试使用的QString :: fromUtf8阅读的说法,是这样的:

int main(int argc, char *argv[]) 
{ 
    QString fileName(QObject::trUtf8(argv[1])); 
    if (fileName != "") 
    { 
     mainWin.loadFile(fileName); 
    } 
    // stuff 
} 

的QObject :: trUtf8实际上是一个包装,将利用QString:fromUtf8并仍然执行翻译(尽管我不明白你为什么要翻译文件名)

+0

它不在Windows上以UTF-8存储。 – Philipp 2010-07-12 12:31:03