Qt5 – Natywny file&directory selector przez JNI.

QFileDialog w Qt5 na Androidzie jest fatalny. Na szczęście znalazłem minimalistyczny fileselector:

http://www.scorchworks.com/Blog/simple-file-dialog-for-android-applications/

który świetnie się sprawdza w AspeQT:

IMG_20150719_123904Musiałem go tylko lekko zmodyfikować, bo na nazwę pliku oczekuję w pętli po stronie Qt (lame, ale brakło mi czasu na bardziej eleganckie rozwiązanie)  i bez Cancel nie dało się z niej wyskoczyć:

QAndroidJniObject::callStaticMethod<void>("net/greblus/MyActivity", "runFileChooser", "()V");

QString fileName = NULL;
do
{
   QAndroidJniObject jFileName = QAndroidJniObject::getStaticObjectField<jstring>("net/greblus/MyActivity", "m_chosen");
   fileName = jFileName.toString();

   if (fileName == "Cancelled") {fileName.clear(); break;}
   if (fileName == "None") QThread::yieldCurrentThread();
}
while (fileName == "None");

A w Javie, cały widz polega na tym, że MyActivity jest singletonem i niestatyczne metody (jak w FileChooser) trzeba wołać w wątku UI Androida z instancji singletona:


public class MyActivity extends QtActivity
{
   ...
   public static MyActivity s_activity = null;
   ...
   public void onCreate(Bundle savedInstanceState)
   {
      s_activity = this;
   }
   ...
}
public static void runFileChooser() {
   m_chosen = "None";
   MyActivity.s_activity.runOnUiThread( new FileChooser() );
}

i wtedy można z C++ wywołać QAndroidJNIObject tak:

QAndroidJniObject::callStaticMethod<void>("net/greblus/MyActivity", "runFileChooser", "()V");

Lekko zmodyfikowany plik tutaj.

bigger_aspeqt

Skomentuj

Wprowadź swoje dane lub kliknij jedną z tych ikon, aby się zalogować:

Logo WordPress.com

Komentujesz korzystając z konta WordPress.com. Log Out / Zmień )

Zdjęcie z Twittera

Komentujesz korzystając z konta Twitter. Log Out / Zmień )

Facebook photo

Komentujesz korzystając z konta Facebook. Log Out / Zmień )

Google+ photo

Komentujesz korzystając z konta Google+. Log Out / Zmień )

Connecting to %s