История изменений
Исправление
ckotinko,
(текущая версия)
:
смотри как это сделано внутри:
ты пишешь c одной стороны сигнал
void mysig(void * arg1, int arg2, double arg3)
void myslot(void * arg1, int arg2)
в общем случае, аргументы копируются, то есть можешь считать, что создается вот такая структура(в реальности немного не так, но пофиг)
struct args_for_signal_mysig : some_common_struct_for_sigs {
void * arg1;
int arg2;
double arg3;
void * pargs[3];
};
void mysig(void * arg1, int arg2, double arg3) {
void * args = new args_for_signam_mysig;
args->arg1 = arg1;
args->arg2 = arg2;
args->arg3 = arg3;
args->pargs[0] = &args->arg1;
args->pargs[1] = &args->arg2;
args->pargs[2] = &args->arg3;
send_signal_somehow(args, args->pargs, 3);
void myclass::dispatch_signal(QObject * sender, int signal_id, void ** pargs, int count) {
case 100500:
if (count >= 2)
this->myslot(*reinterpret_cast<void*>(pargs[0]),
*reinterpret_cast<int*>(pargs[1]));
то есть любой аргумент сперва копируется как есть, по правилам С++, затем берется его адрес и кастуется к void*, и в составе массива уходит получателям. получатели же берут этот массив и раскастовывают указатели обратно к нужным типам, дереференсят и получают нужные типы. поэтому типы аргументов должны совпадать.
конкретно в твоем случае если соединение только прямое, то этап копирования в самом сигнале будет пропущен и массив указателей соберут прямо из аргументов. если соединение не прямое, то копирование произойдет, при этом QString& будет низведен до QString, который станет копией и именно на него будет передан указатель.
указатель же на ссылку = ссылке. они в принципе одно и то же только по разному пишутся.
Исходная версия
ckotinko,
:
смотри как это сделано внутри:
ты пишешь c одной стороны сигнал
void mysig(void * arg1, int arg2, double arg3)
void myslot(void * arg1, int arg2)
в общем случае, аргументы копируются, то есть можешь считать, что создается вот такая структура(в реальности немного не так, но пофиг)
struct args_for_signal_mysig : some_common_struct_for_sigs {
void * arg1;
int arg2;
double arg3;
void * pargs[3];
};
void mysig(void * arg1, int arg2, double arg3) {
void * args = new args_for_signam_mysig;
args->arg1 = arg1;
args->arg2 = arg2;
args->arg3 = arg3;
args->pargs[0] = &args->arg1;
args->pargs[1] = &args->arg2;
args->pargs[2] = &args->arg3;
send_signal_somehow(args, args->pargs, 3);
void myclass::dispatch_signal(QObject * sender, int signal_id, void ** pargs, int count) {
case 100500:
if (count >= 2)
this->myslot(*reinterpret_cast<void*>(pargs[0]),
*reinterpret_cast<int*>(pargs[1]));
то есть любой аргумент сперва копируется как есть, по правилам С++, затем берется его адрес и кастуется к void*, и в составе массива уходит получателям. получатели же берут этот массив и раскастовывают указатели обратно к нужным типам, дереференсят и получают нужные типы. поэтому типы аргументов должны совпадать.