Forum: Diğer Konular RSS
C++ - Unknown method parameter type Hatası
İbrahim #1
Üye Eki 2015 tarihinden beri · 126 mesaj
Grup üyelikleri: Üyeler
Profili göster · Bu konuya bağlantı
Konu adı: C++ - Unknown method parameter type Hatası
Selamün Aleyküm;
Şöyle bir kod yazdım:
// testclass.h
class TestClass : public QObject
{
  Q_OBJECT
public:
  Q_INVOKABLE enum Duration {
    SHORT = 0,
    LONG = 1
  };
 
  explicit TestClass(QObject *parent = 0);
  Q_INVOKABLE QString message(const QString& msg);
  Q_INVOKABLE void toast_message(const QString& text, Duration duration);
 
signals:
 
public slots:
};
...
// testclass.cpp
...
void TestClass::toast_message(const QString& text, Duration duration = SHORT)
{
  QAndroidJniObject _text = QAndroidJniObject::fromString(text);
  QAndroidJniObject toast = QAndroidJniObject::callStaticObjectMethod("android/widget/Toast", "makeText",
                                      "(Landroid/content/Context;Ljava/lang/CharSequence;I)Landroid/widget/Toast;",
                                      QtAndroid::androidActivity().object(), _text.object(), jint(duration));
  toast.callMethod<void>("show");
}
...

Bu sınıf ve üye fonksiyon QML içerisinde kullanılacak ve uygulamayı çalıştırdığımda uygulama çalışıyor lakin toast_message üye fonksiyonu devreye sokulduğunda şu uyarıyı veriyor: W/libQt_App.so(11956): qrc:/Page1.qml:17 ((null)): qrc:/Page1.qml:17: Error: Unknown method parameter type: Duration
Yani neden Duration numaralandırma tipli parametreyi bilinmeyen parametre olarak algılıyor? Nasıl çözüme ulaşabilirim? Teşekkürler!
acehreli (Moderatör) #2
Kullanıcı başlığı: Ali Çehreli
Üye Haz 2009 tarihinden beri · 4389 mesaj
Grup üyelikleri: Genel Moderatörler, Üyeler
Profili göster · Bu konuya bağlantı
Bunlar çok özelleşmiş konular. :) Bende hâlâ biraz C++ kaldı ama Qt'den hiç anlamıyorum. Dışarıdan bir gözlemci olarak tek söyleyebileceğim şey, genel bir kural olarak, = SHORT gibi varsayılan değerler bildirime yazılmalıdır, tanıma değil. Belki o yüzdendir.

Ali
İbrahim #3
Üye Eki 2015 tarihinden beri · 126 mesaj
Grup üyelikleri: Üyeler
Profili göster · Bu konuya bağlantı
Aslında bu sorunu çözdüm: Q_ENUM(Duration) demem gerekiyormuş. Fakat daha sonra uygulamayı Android'de çalıştırınca "çalışmayı durdurdu" hatası aldım ve log ekranında şu hatayı gördüm: F/libc    (14649): Fatal signal 11 (SIGSEGV) at 0x0000002c (code=1), thread 14849 (project.example). Aslında hata toast_message içindeki işlemlerin thread içinde yapılması gerektiğini anlıyorum (bkz: https://www.kdab.com/qt-android-use-android-toast/). Lakin runOnAndroidThread gibi UI thread'ine niçin ihtiyacımız olduğunu anlamıyorum. Yazılımcı burada thread kullanması gerektiğini nasıl anlıyor? Yoksa Qt penceresi içinde saf native Android Java kodu çalıştırdığımız için aynı anda 2 faklı iş mi yapılmış oluyor da thread gerekiyor?

Konu dışı: Ali Hocam siz paranızı C++'dan mı yoksa D'den mi kazanıyorsunuz? :)
acehreli (Moderatör) #4
Kullanıcı başlığı: Ali Çehreli
Üye Haz 2009 tarihinden beri · 4389 mesaj
Grup üyelikleri: Genel Moderatörler, Üyeler
Profili göster · Bu konuya bağlantı
Ben iki aydan beri yalnızca D (ve tabii biraz Python) kullanan Weka.io'da çalışıyorum. Daha önce çalıştığım Riverbed'de ise C++11 ve sonrasına tam anlamıyla geçmemiş olduğumuzdan, her ne kadar modern olanaklarını biliyor olsam da kendimi artık C++'ta deneyimli görmüyorum.

Ali
kerdemdemir #5
Üye Eyl 2013 tarihinden beri · 53 mesaj
Grup üyelikleri: Üyeler
Profili göster · Bu konuya bağlantı
İbrahim Selam,

Q_INVOKABLE fonksiyonlar için kullanılır. Biraz ismide anımsatıyor zaten. Bu qInvokable'la şöyle şeyler yapılabilir.

class A : public QObject
{
  //QObject macrosu filan fişman 
 
  Q_INVOKABLE void foo();
}
   A a;
   QMetaObject::invokeMethod(&a, "foo",  Qt::AutoConnection); //--> foo diye bir string kullanarak method çağırdım 

Bu özellik büyük programlarda "reflection"(yanlış kullanıyor olabilirim) yapabilmemizi sağlar. Yani "foo" string'ini programın dışından bir XML 'den filan okuduğumuzu düşün bu durumda programa bir dinamiklik kazandırıyoruz. Dosyadan okuduğumuz isme göre değişik methodlar çağırabiliyoruz.

Methodlar için kullanılması gereken Q_INVOKABLE 'in bir enum için kullanılması biraz ilginç geldi bana.
Acaba başka bir yerde varmıdır böyle kullanım emin olmadığımdan sorayım dedim.
İbrahim #6
Üye Eki 2015 tarihinden beri · 126 mesaj
Grup üyelikleri: Üyeler
Profili göster · Bu konuya bağlantı
@kerdemdemir merhaba;
Aslında Q_INVOKABLE yalnızca fonksiyonlar için geçerli dediğiniz gibi. Bu koddaki enuma bu makroyu ben verdim çünkü tek enuma hata verince ben de bu şekilde denedim ama böyle de çalışmadı. Zaten dediğiniz gibi yanlış bir kullanım bu şekilde. Doğrusu: http://doc.qt.io/qt-5/qobject.html#Q_INVOKABLE

Siz Qt biliyorsanız F/libc    (14649): Fatal signal 11 (SIGSEGV) at 0x0000002c (code=1), thread 14849 (project.example) bu hatada ui thread kullanmamız gerek lakin niçin thread kullanıyoruz? Çünkü burada sadece toast mesajı gösteriyoruz, normal javada toast mesajı için kullanmiyoruz da neden Qt - C++ içinde javadan toast mesajı çalıştırırken ui thread kullanmamız gerek? Teşekkürler.
İbrahim #7
Üye Eki 2015 tarihinden beri · 126 mesaj
Grup üyelikleri: Üyeler
Profili göster · Bu konuya bağlantı
void TestClass::toast_message(const QString& text, Duration duration) {
  std::thread run([&]
  {
    QAndroidJniObject _text = QAndroidJniObject::fromString(text);
    QAndroidJniObject toast = QAndroidJniObject::callStaticObjectMethod(
             "android/widget/Toast", "makeText", 
             "(Landroid/content/Context;Ljava/lang/CharSequence;I)Landroid/widget/Toast;",
             QtAndroid::androidActivity().object(), _text.object(), jint(duration));
     toast.callMethod<void>("show");
     });
    run.join();
}
Bu arada şöyle bir değişiklik yaptım kodda ama bu kod ile yine aynı thread hatasını aliyorum. KDAB sitesinde Java thread'i kullanmış (https://www.kdab.com/qt-android-run-c-code-android-ui-thre…) ama ben herşeyi java'ya bırakmamak için C++ tarafında std::thread, QThread, std::async vb. özelliklerle yapmaya çalıştım kodda da görüldüğü gibi lakin yine ayni hatayi aliyorum. Bunu nasil yapabilirim ve sorun neyden kaynaklı bu halde? Çünkü std::thread koydum üye fonksiyona ama nafile.
Doğrulama Kodu: VeriCode Lütfen resimde gördüğünüz doğrulama kodunu girin:
İfadeler: :-) ;-) :-D :-p :blush: :cool: :rolleyes: :huh: :-/ <_< :-( :'( :#: :scared: 8-( :nuts: :-O
Özel Karakterler:
Bağlı değilsiniz. · Şifremi unuttum · ÜYELİK
This board is powered by the Unclassified NewsBoard software, 20100516-dev, © 2003-10 by Yves Goergen
Şu an: 2017-03-22, 15:16:59 (UTC -07:00)