الإدخال والإخراج لبيانات الفئات



لسلام عليكم ورحمة الله وبركاته

الإدخال والإخراج لبيانات الفئات

عندما تريد حفظ متغيرات من نوع 'أ' في ملف ومن ثم تقرأها في وقت آخر أو حين تريد
تبادل بيانات من نوع 'أ' عبر الشبكة فإنك بحاجة الى نقل البيانات الثنائية بطريقة
تسهل عليك التعامل معها وتوفر لك الوقت...

فمثلا في الفئات QFont و QColor و ...... الخ تم توفير المعاملين

  1. QDataStream & operator<< ( QDataStream & s, const QFont & font )
  2.  
  3. (QDataStream & operator>> ( QDataStream & s+, QFont & font
الأول للكتابة من الفئة الى ملف او الى QByteArray او QIODevice او .... الخ
والثاني للقراءة من ملف أو من QByteArrayاو QIODevice او .... الخ .

مثال

  1. QFont font1,font2;
  2.  
  3.  
  4. QDataStream ds(&ba,QIODevice::WriteOnly);
  5.  
  6. QDataStream ds2(&ba,QIODevice::ReadOnly);
  7.  
  8. ds<<font1;
  9.  
  10.  
  11. ds2>>font2;


وبالتأكيد البيانات التي يتم حفظها بيانات ثنائية أي لو أنك حفظتها على ملف فإنه
ملف ثنائي ...

والهدف الآن هو كيف تقوم أنت ببناء أسلوب أكثر ديناميكية في الإدخال والإخراج
للفئات التي قمت أنت بتصميمها ...

خطوات العمل

1- بناء الفئة

2- التصريح عن الفئة ضمن metaType


3- بناء معاملات الإدخال والإخراج

4- تسجيل الفئة ضمن meta type stream operators

أولا بناء الفئة:-

  1. class A{
  2.  
  3. public:
  4.  
  5. A(){}
  6.  
  7. QString name;
  8.  
  9. qint32 age;
  10.  
  11.  
  12. };


ثانيا التصريح عن الفئة ضمن metaType :-

  1. Q_DECLARE_METATYPE(A);


ثالثا بناء معاملات الإدخال والإخراج :-

  1. QDataStream &operator<<(QDataStream &out, const A &a){
  2.  
  3. out<<a.name<<(qint32)a.age;
  4.  
  5. return out;
  6.  
  7. }
  8.  
  9. QDataStream &operator>>(QDataStream &in, A &a){
  10.  
  11. in>>a.name>>a.age;
  12.  
  13. return in;
  14.  
  15.  
  16. }


رابعا تسجيل الفئة ضمن meta type stream operators :-

  1. qRegisterMetaTypeStreamOperators<A>('A');


والآن أصبح بإمكانك القراءة والكتابة مع الفئة A بكل يسر وسهولة سواء مع الملفات او
القراءة والكتابة عبر الشبكة أو حتى كمتغير .QByteArray

مثال شامل:-

  1. #include <QtCore>
  2.  
  3. class A{
  4.  
  5. public:
  6.  
  7. A(){}
  8.  
  9. QString name;
  10.  
  11. qint32 age;
  12.  
  13. };
  14.  
  15. Q_DECLARE_METATYPE(A);
  16.  
  17. QDataStream &operator<<(QDataStream &out, const A &a){
  18.  
  19. out<<a.name<<(qint32)a.age;
  20.  
  21. return out;
  22.  
  23. }
  24.  
  25. QDataStream &operator>>(QDataStream &in, A &a){
  26.  
  27. in>>a.name>>a.age;
  28.  
  29. return in;
  30.  
  31. }
  32.  
  33. int main(int argc, char *argv[])
  34.  
  35. {
  36.  
  37. QCoreApplication app(argc, argv);
  38.  
  39. qRegisterMetaTypeStreamOperators<A>('A');
  40.  
  41. A from,to;
  42.  
  43. from.name='mohammed alabdaly';
  44.  
  45. from.age=20;
  46.  
  47.  
  48. QDataStream ds(&ba,QIODevice::WriteOnly);
  49.  
  50. QDataStream ds2(&ba,QIODevice::ReadOnly);
  51.  
  52. QMetaType::save(ds,qMetaTypeId<A>(),&from);//كتابة بيانات المتغير
  53.  
  54. QMetaType::load(ds2,qMetaTypeId<A>(),&to);//قراءة بيانات المتغير
  55.  
  56. qDebug()<<QObject::tr('%1,%2').arg(to.name).arg(to.age);
  57.  
  58.  
  59. return app.exec();



تمت طباعة الدرس من موقع مكتبة الدروس
http://qt-ar.org/lessons/show47.html