الفريق العربي للبرمجةأرشيف المنتديات · 2000 – 2023
نسخة أرشيفية للقراءة فقط — التسجيل والمشاركة مغلقان، والمحتوى محفوظ كما كان.

استفسار عن Signal و Slot فى حالة فصل الواجهة عن كود معالجة البيانات

بدأه محمد عودة في 3 يونيو 2012 · 4 رد · 942 مشاهدة · في قسم Cross Platform GUI Libraries العام
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

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

أخوانى انا لدى استفسار حول فهم اﻻتصال بين فئة للواجهة الرسومية وواجهة للكود.

حقيقة انا ليس لدى مشكلة فى فهم الكود عندما يكود المعاجة مدمج مع كود الواجهة لكن المشكلة عن الفصل.

لدينا:

1.ملف تعريف والكود التنفيذى لفئة الواجهة:

/// bytconverterdailog.h

#ifndef BYTECONVERTERDAILOG_H
#define BYTECONVERTERDAILOG_H

#include <QDialog>
namespace Ui {
class ByteConverterDailog;
}
class ByteConverterDailog : public QDialog
{
    Q_OBJECT    
public:
    explicit ByteConverterDailog(QWidget *parent = 0);
    ~ByteConverterDailog();    
private:
    Ui::ByteConverterDailog *ui;
};
#endif // BYTECONVERTERDAILOG_H

#include "byteconverterdailog.h"
#include "ui_byteconverterdailog.h"
// byteconverter.cpp

#include "byteconverter.h"

ByteConverterDailog::ByteConverterDailog(QWidget *parent) :
    QDialog(parent),
    ui(new Ui::ByteConverterDailog)
{
    ui->setupUi(this);
    byteConverter *bc = new byteConverter(this);

    connect(ui->decEdit, SIGNAL(textChanged(QString)),bc,SLOT(setDec(QString)));
    connect(ui->binEdit, SIGNAL(textChanged(QString)),bc,SLOT(setBin(QString)));

    connect(bc, SIGNAL(decChanged(QString)),ui->decEdit,SLOT(setText(QString)));
    connect(bc, SIGNAL(binChanged(QString)),ui->binEdit,SLOT(setText(QString)));
}

ByteConverterDailog::~ByteConverterDailog(){
    delete ui;
}

2.ملف تعريف والكود التنفيذى لفئة معالجة البيانات.

/// byteconverter.h
#ifndef BYTECONVERTER_H
#define BYTECONVERTER_H
#include <QObject>

class byteConverter : public QObject
{
    Q_OBJECT
public:
    explicit byteConverter(QObject *parent = 0);

signals:
    void decChanged(const QString &);
    void binChanged(const QString &);

public slots:
    void setDec(const QString &);
    void setBin(const QString &);    
};
#endif // BYTECONVERTER_H

// byteconverter.cpp

#include "byteconverter.h"

byteConverter::byteConverter(QObject *parent) :
    QObject(parent)
{
}
void byteConverter::setDec(const QString &newvalue){
    emit binChanged(newvalue);
}

void byteConverter::setBin(const QString &newvalue){
    emit decChanged(newvalue);
}

الدالة الرئيسية:

// main.cpp

#include <QtGui/QApplication>
#include "byteconverterdailog.h"

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    ByteConverterDailog w;
    w.show();

    return a.exec();
}

انا مشكلتى فى فهم هذا لسطر بملف byteconverterdailog.cpp فقط.

connect(bc, SIGNAL(decChanged(QString)),ui->decEdit,SLOT(setText(QString)));

أريد فهم آلية اﻻتصال بين الفئة المعالجة والفئة الرسومية فى استقبال وارسال اﻻشارات ...

وعلاقتة أيضا بالسطر :

    connect(ui->decEdit, SIGNAL(textChanged(QString)),bc,SLOT(setDec(QString)));

وجزاكم الله خير .

تم تعديل هذه المشاركة بواسطة AudaNix في 3 يونيو 2012 في 12:14

post-15367-027053900%201340345097.gifpost-15367-087183200%201340344597.gif
post-247365-0-10080400-1379403554_thumb.

#2

لا ادري اذا فهمت السؤال بشكل صحيح ولكن الداله connect صيغتها كالتالي

connect(sender object, SIGNAL(event function), receiving object, SLOT(handling function));

SIGNAL هي عبار عن ماكرو يستقبل اسم الداله الخاصه بالحدث

و SLOT هي عبارة عن ماكرو يستقبل اسم الداله الخاصه بمعالجة الحدث

يمكن التفكير بها كالتالي

When sender object emits signal (x) the receiving object slot(y) is called to handle the event

كما تعلم ان التطبيق الداخلي عبارة عن function pointers

اتمنى ان اكون قد اجبت على سؤالك وان كان سؤالك شيئ اخر ارجو التوضيح

تحياتي

No intellectual battle was ever won through retreat
You do not watch Gintama? Dude, you are missing a lot!


صورةmsrgb1485.gif ocajavase7programmerclr.gif

#3

شكرا اخى لكن ليس هذا ما اقصدة....

اﻻمر يتعلق بمفهوم انشاء دالة استقبال جديدة slot فى الفئة ثم استدعائها .

post-15367-027053900%201340345097.gifpost-15367-087183200%201340344597.gif
post-247365-0-10080400-1379403554_thumb.

#4

طبعا هناك slots جاهزة في بعض الكلاسات بينما يمكنك تعريف slots خاصه بك باستخدام public slots او private slots او غيره طبعا اذا كان كلاسك يقوم بتعريف slots خاصه به فعندها يجب عليك بدء تعريف الكلاس بالموجه Q_OBJECT

طبعا الداله setDec معرفه اصلا على انها slot في الكلاس byteconverter ، الاستدعاء SLOT يجب ان تضع فيه اسم داله تعتبر معرفه كslot مالم فالامر لاينفع

بالنسبة لالية الربط ، فالدالة connect تقوم باخذ مؤشر الى كل من الداله الsignal والداله الslot عند حدوث حدث معين يتم عمل emit للداله الsignal وهذه الدالة تستدعي جميع الدوال الslots المرتبطه بها عن طريق المؤشرات لهذه الدوال ولكن ترتيب الاستدعاء للslots غير معرف وبهذا الشكل يتم استدعاء داله الslot الخاصه بك عبر مؤشر لها

هل هذا ماقصدته؟

تحياتي

تم تعديل هذه المشاركة بواسطة mental-driller في 12 يوليو 2012 في 13:28

No intellectual battle was ever won through retreat
You do not watch Gintama? Dude, you are missing a lot!


صورةmsrgb1485.gif ocajavase7programmerclr.gif

#5

السلام عليكم , عموما لست ممن يأخذ منه هذه الأشياء لعدم إكتمال معرفتي بالكيوتي و لكن حاول الإتصال مع الأخ SudaNex فأنا أعلق عليه آمالا كبيرة في الكيوتي .

connect(bc, SIGNAL(decChanged(QString)),ui->decEdit,SLOT(setText(QString)));;

أضن شخصيا , أن فكرة connect التي تعتمد تقنية ( Signal و Slot ) هي مجرد دالة تنصت, أي أن الدالة connect تقوم بالتنصت على الكائن bc فإن حصل حدث للدالة (decChanged(QString) ( يعني أصبحت الدالة طور التنقيذ ) ستقوم ال connect بتنشيط الدالة setText(QString) من الكائن ui->decEdit . الملاحظ هنا أن الدالة decChanged(QString) تمتاز بالبارميتر QString أي أن ال connect تعمل على إرسال البارميتر إلى الدالة setText(QString) .

أرجوا من الله أن أكون قد وفقت.

تم تعديل هذه المشاركة بواسطة 3ds max2010 في 14 يوليو 2012 في 22:10

تخيل, هل سيكون مستقبل الأوبن جي أل مع البشرية هكذا

future.jpg

مواضيع مشابهة

عدد الزوار حالياً

المتواجدون خلال آخر دقيقتين · يتحدّث كل ٣٠ ثانية

—الإجمالي—أعضاء مسجّلون—زوار بدون تسجيل

جارٍ التحقق من المتواجدين…