当我使用Qt Android Extras C ++类时如何防止Windows错误

时间:2018-07-18 04:42:13

标签: android c++ qt c++11 qtandroidextras

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

Qt/Necessitas - reasonable QFileDialog replacement/skin?

但是它仅适用于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':未定义基类

2 个答案:

答案 0 :(得分:2)

ResultReceiver继承了QAndroidActivityResultReceiver(来自Android Extras),您正确停止了该操作(包括Windows OS),因此发生了错误。

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

用解决Qt预处理器的import问题的相同方式,您可以为 example

定义ResultReceiver
#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

答案 1 :(得分: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
}

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