【问题标题】:How prevent errors on windows when i use Qt Android Extras C++ Classes当我使用 Qt Android Extras C++ 类时如何防止 Windows 上的错误
【发布时间】:2018-12-25 21:12:14
【问题描述】:

我使用以下问题的解决方案在 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':基类未定义

【问题讨论】:

  • Mohsen,您希望 Android Extras QAndroidActivityResultReceiver 的类部分如何在 windows 下工作,
  • @MohammadKanan 我想在 android 和 windows 上运行我的应用程序。我想要这个适用于 android 的解决方案,现在它可以工作了,我想在 windows 上使用 FileDialog。但是如何运行我的应用程序windows 什么时候我想把它用在 android 上?

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


【解决方案1】:

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

您必须拥有ResultReceiver 类的 2 个变体,一个用于 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

【讨论】:

    【解决方案2】:

    可以理解,工程是按照你的 *.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
    }
    

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

    【讨论】:

    • 它仍然不起作用,我收到No such file or directory 错误。我的项目没有编译,
    • “仍然不起作用”没有说明问题。你可能做错了什么。在 .pro 和预处理器指令中使用有条件的包含肯定会有所帮助。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-01-05
    • 2014-10-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-07-13
    相关资源
    最近更新 更多