قراءة البيانات الوصفية الخاصة ضمن فئة البرنامج المساعد Qt

StackOverflow https://stackoverflow.com//questions/23034047

  •  21-12-2019
  •  | 
  •  

سؤال

أقوم حاليًا بكتابة مكون Qt الإضافي الخاص بي لاستخدامه في برنامج Qt.لتحديد معلومات إصدار البرنامج المساعد، أستخدم البيانات الوصفية المخزنة في ملف JSON كما يلي:

{
    "type" :            "communication",
    "name" :            "USB-LIN-IB",
    "longname" :        "USB-LIN Communication",
    "version" :         "1.1",
    "dependencies" :    []
}

للوصول إلى معلومات البيانات الوصفية هذه من خارج فئات المكونات الإضافية (داخل عالم برنامج Qt)، أرجع إليها لأنني قمت بتعريف ملف JSON على النحو التالي:

Q_PLUGIN_METADATA(IID "org.plugins.communications.1" FILE "USBLINCommunication.json")

هل من الممكن استخدام طريقة موحدة ومريحة للوصول إلى نفس البيانات الوصفية تمامًا من داخل عضو البرنامج الإضافي (على سبيل المثال:منشئ البرنامج المساعد)؟بالطبع، يمكنني إما استخدام QPluginLoader (الذي يجب أن أعرف مسار ملف البرنامج الإضافي له) أو ملف readAll من كائن JSON.ومع ذلك، تعتمد كلتا الطريقتين على معرفة المسار الدقيق للمكون الإضافي وملف JSON.هذا ليس موثوقًا جدًا بالنسبة لي.

اعتقدت أن هناك طريقة أخرى أكثر توحيدا؟

هل كانت مفيدة؟

المحلول

لا تحتاج إلى معرفة المسار المطلق لملف البرنامج المساعد QPluginLoader, ، حتى تكون آمنًا.

يمكنك فقط تمرير اسم البرنامج المساعد، وسوف يعمل بشكل جيد.سيُرجع أيضًا اسم الملف المؤهل بالكامل للمكون الإضافي، بما في ذلك المسار الكامل للمكون الإضافي إذا كنت تقرأ اسم الملف مرة أخرى بالطريقة المقابلة.وسوف يكون واضحا للفصل بناء على المعلومات التي يمكن الحصول عليها منها QCoreApplication::libraryPaths().

هنا هو الجزء المقابل من وثائق:

عند تحميل البرنامج المساعد، يبحث QPluginLoader في الدليل الحالي وفي جميع مواقع البرنامج المساعد المحددة بواسطة QCoreApplication::libraryPaths()، ما لم يكن لاسم الملف مسار مطلق.بعد تحميل المكون الإضافي بنجاح، يُرجع fileName() اسم الملف المؤهل بالكامل للمكون الإضافي، بما في ذلك المسار الكامل للمكون الإضافي إذا تم تقديمه في المُنشئ أو تمريره إلى setFileName().

لذلك، ما يمكنك القيام به بشكل أساسي هو:

myPluginLoader.metaData().value("MetaData").toObject().value("foo").toString()

حيث يمكن أن يكون foo أحد مفاتيحك المذكورة أعلاه.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top