2

我们的应用程序是跨平台的,因此是用 Qt 编写的。目标平台是 Windows 和 Mac。在我们的项目中,我们需要确定一个单独进程的所有打开文件的列表。现在我们使用 WinAPI 和相应的 Mac OsX API 以依赖于平台的方式来完成它。只要我们需要维护两个不相关的程序版本,这种做法就已经造成了很多问题。

如果有任何帮助,我们需要为 Traktor 和 Serato(Dj Intro 和 Scratch Live)等程序确定打开的音频文件列表。而我们使用的Qt版本是4.8.0。

那么,问题是,是否有任何独立于平台的方法来获取打开的文件列表?或者至少是使用某些第三方库或实用程序的某种解决方法?

4

1 回答 1

1

甚至 Qt 也不是独立于平台的 ;) 它只是将平台细节(如 WIN32 API 与 X11 API)封装在一个通用 API 下。在您的情况下,我也会这样做:设计一个(基于 Qt 的)类,它提供您在应用程序中需要的 API,然后使用您已经存在的(特定于平台的)代码来提供您需要的功能。在您的应用程序中,您将只使用基于 Qt 的 API,您无需担心应用程序代码中的平台细节。此外,您可以针对您的 API 编写任意数量的单元测试,以确保其行为正确。

示例(不是 100% 完整的代码!):

在你的头文件中:

class QMySpecificAPI : public QObject {
    Q_OBJECT    // only required when you need signals/slots

public:
    QList<QString> getOpenFiles();
}

在您的 cpp 文件中:

#include "QMySpecificAPI.h"

#ifdef Q_WS_WIN
QList<QString> QMySpecificAPI::getOpenFiles() {
   // Use WIN32 API to retrieve the file list
}
#endif

#ifdef Q_WS_MAC
QList<QString> QMySpecificAPI::getOpenFiles() {
    // Use MACOSX API to retrieve the file list
}
#endif

特别是你说你现有的代码已经有很多问题了,我强烈建议你实现单元测试用例并让它们定期运行以自动检查你的代码,比如

...
QMySpecificAPI api;
QList<QString> fileList = api.getOpenFiles();
ASSERT(fileList.count() == 5);   // or whatever you expect
...
于 2012-09-18T11:24:52.847 回答