PDA

View Full Version : تعریف signal/slot



zehs_sha
پنج شنبه 14 مرداد 1389, 15:36 عصر
سلام من برای تعریف signal/slot در کلاس زیر به مشکل برخوردم



#ifndef EMPLOYEE_H
#define EMPLOYEE_H
#include <qobject.h>

class Employee:public QObject
{
Q_OBJECT
public:
Employee();
int salary() const { return mySalary; }

public slots:
void setSalary(int newSalary);

signals:
void salaryChanged(int newSalary);
private:
int mySalary;
};

#endif // EMPLOYEE_H




و اینم بدنه کلاس



#include "employee.h"


Employee::Employee(){
mySalary = 0;
}

void Employee::setSalary(int newSalery){
if (mySalary!=newSalery){
mySalary=newSalery;
emit salaryChanged(newSalery);
}
}


void Employee::salaryChanged(int newSalary){

}


1- مشکل اول salaryChanged را باید چگونه تعریف کنیم ؟ و استفاده کنیم ؟
2- از تابع connect چگونه باید استفاده کنیم و تعریف کنیم ؟

حامد مصافی
پنج شنبه 14 مرداد 1389, 20:06 عصر
1- salaryChanged نبايد پياده سازي شود، شما بايد در موقعيت مناسب اين سيگنال را با فرمان emit ارسال كنيد.
2- مانند زير (فرض كنيد نام كلاس من myClass است):



myClass::a_routine()
{
Employee *newEmployee = new Employee;
connect( newEmployee, SIGNAL( salaryChanged(int) ),
this, SLOT( slot_salaryChanged(int) ) )
}
myClass::slot_salaryChanged(int n)
{
qDebug() << "salaryChanged...! do somethign with n here!!!";
}

zehs_sha
پنج شنبه 14 مرداد 1389, 20:25 عصر
با سلام و تشکر امکان هست راجب connect بسیار مختصر را نیز توضیح دهید

حامد مصافی
پنج شنبه 14 مرداد 1389, 20:29 عصر
زماني كه اتفاقي مي افتد يك سيگنال ارسال مي شود، در مقابل يك slot توانايي دريافت اين signal ها را دارد، اما اين ارتباط با تابع connect صورت ميگيرد. در واقع شما مشخص مي كنيد چه signal ي بايد توسط كدام slot دريافت شود.

zehs_sha
یک شنبه 17 مرداد 1389, 19:38 عصر
من در کلاس work بدین صورت پیاده سازسی کردم :



#ifndef WORK_H
#define WORK_H

#include <qobject.h>

class Work:public QObject
{
Q_OBJECT;
public:
Work();
void run();
void slot_salaryChanged(int n);
};

#endif // WORK_H






Work::Work()
{
}

void Work::run(){
Employe *employe=new Employe();
connect(employe,SIGNAL(salaryChanged(int)),this,SL OT(slot_salaryChanged(int)));
employe->setSalary(100);
}


void Work::slot_salaryChanged(int n)
{
qDebug() << "salaryChanged...! do somethign with n here!!!"<<n;
}


پیغام زیر را می دهد؟



Object::connect: No such slot Work::slot_salaryChanged(int) in work.cpp:11

saeedIRHA
یک شنبه 17 مرداد 1389, 22:32 عصر
من در کلاس work بدین صورت پیاده سازسی کردم :



#ifndef WORK_H
#define WORK_H

#include <qobject.h>

class Work:public QObject
{
Q_OBJECT;
public:
Work();
void run();
void slot_salaryChanged(int n);
};

#endif // WORK_H






Work::Work()
{
}

void Work::run(){
Employe *employe=new Employe();
connect(employe,SIGNAL(salaryChanged(int)),this,SL OT(slot_salaryChanged(int)));
employe->setSalary(100);
}


void Work::slot_salaryChanged(int n)
{
qDebug() << "salaryChanged...! do somethign with n here!!!"<<n;
}


پیغام زیر را می دهد؟



Object::connect: No such slot Work::slot_salaryChanged(int) in work.cpp:11


تابع slot_salaryChanged به صورت زیر تعریف کن در header فایل :


public slots:
void slot_salaryChanged(int n);