androidc++qtc++11qtandroidextras

How prevent errors on windows when i use Qt Android Extras C++ Classes


I used the solution of below question for open file on Android.

Qt/Necessitas - reasonable QFileDialog replacement/skin?

But it works just on android,this codes (Qt Android Extras C++ Classes) don't run on windows?

for example i got the below errors?

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

Cannot open include file: 'QAndroidJniObject': No such file or directory

I used this for solving

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

but when i used this I have got another errors?

 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': base class undefined


Solution

  • The class ResultReceiver inherits QAndroidActivityResultReceiver (from Android Extras) which you correctly stopped including for windows OS, thus the error.

    You must have 2 variants of ResultReceiver class, one for Windows, another for Android. When you design it for Windows you should not inherit QAndroidActivityResultReceiver and use QFileDialog.

    In the same way you solved the import issues with Qt pre-processor, you could define ResultReceiver class , for example:

    #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