-1

我使用以下问题的解决方案在 Android 上打开文件。

Qt/Necessitas - 合理的 QFileDialog 替换/皮肤?

但它只适用于android,这个代码(Qt Android Extras C++ Classes)不能在windows上运行?

例如我得到以下错误?

#include<QAndroidJniObject>
#include<QtAndroid>
#include<QAndroidActivityResultReceiver>

无法打开包含文件:'QAndroidJniObject':没有这样的文件或目录

我用这个来解决

#if defined(Q_OS_ANDROID)
#include<QAndroidJniObject>
#include<QtAndroid>
#include<QAndroidActivityResultReceiver>
#endif

但是当我使用它时,我又遇到了另一个错误?

 class ResultReceiver:public QAndroidActivityResultReceiver//error :'QAndroidActivityResultReceiver': base class undefined
{
    AndroidFileDialog *_dialog;

public:
    ResultReceiver(AndroidFileDialog *dialog);

    virtual ~ResultReceiver();
    void handleActivityResult(int receiverRequestCode, int resultCode, const QAndroidJniObject &data);
    QString uriToPath(QAndroidJniObject uri);
};

'QAndroidActivityResultReceiver':基类未定义

4

2 回答 2

2

该类ResultReceiver继承QAndroidActivityResultReceiver了您正确停止的(从 Android Extras),包括 Windows 操作系统,因此出现错误。

您必须有 2 个ResultReceiver类的变体,一个用于 Windows,另一个用于 Android。当你为 Windows 设计它时,你不应该继承QAndroidActivityResultReceiver和使用QFileDialog.

与您解决importQt 预处理器问题的方式相同,您可以定义ResultReceiverclass ,例如

#if defined(Q_OS_ANDROID)

class AndroidFileDialog : public QObject
{
    Q_OBJECT
  ...
private:
    class ResultReceiver : public QAndroidActivityResultReceiver {
        AndroidFileDialog *_dialog;
        ...
    };
    ...
    ...
};
#else
class ResultReceiver // Here do not inherit classes from Android Extras
{
   QFileDialog *_dialog; // use standard Qt C++ classes 
   ...
   ...
};
#endif //Q_OS_ANDROID
于 2018-07-18T15:20:07.480 回答
1

可以理解,项目是根据你的 *.pro 文件编译的,该文件包含了所有的项目文件。所以你尝试在 Windows 上编译 Android 相关文件,所以你得到一个错误。您应该根据目标操作系统在 *.pro 文件中包含/排除文件,例如:

SOURCES += \
    common.cpp

HEADERS += \
    common.h

win32 {
    SOURCES += \
    winfile.cpp

    HEADERS += \
    winfile.h

    LIBS += -lwin
}

android {
    SOURCES += \
    androidfile.cpp

    HEADERS += \
    androidfile.h

    LIBS += -landroid
}

因此不会编译/链接不必要的文件

于 2018-07-18T09:15:05.423 回答