Russian Qt Forum
Май 03, 2024, 16:17 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: 1 [2]   Вниз
  Печать  
Автор Тема: [РЕШЕНО] Массив сигналов...  (Прочитано 12812 раз)
Гурман
Гуру общения
******
Offline Offline

Сообщений: 1442

Qt 2.2, 3.3, 4.5, 4,7, 4.8, 5.3, 5.6, 5.9, 5.12


Просмотр профиля
« Ответ #15 : Октябрь 16, 2014, 15:39 »

Код
C++ (Qt)
#include "object.h"
 
Object::Object( QObject *parent ) :
QObject( parent ),
m_sigs( 5 )
{
m_sigs[ 0 ] = &Object::sig0;
 
 

Подозреваю, что не будет работать по той же причине, что и пример в конце моего второго поста. Поскольку тут

m_sigs[ 0 ] = &Object::sig0;

присваивается адрес метода некоего статического объекта, то и внутри этот метод получит указатель this на свой объект, а вовсе не на тот, в котором делается вызов (this->*func)( val );

кстати, moc колбасит для вызовов сигналов вот такой вот код:

Код:
int CiControl::qt_metacall(QMetaObject::Call _c, int _id, void **_a)
{
    _id = QObject::qt_metacall(_c, _id, _a);
    if (_c == QMetaObject::InvokeMetaMethod) {
        switch (_id) {
        case 0: localMenuEdit((*reinterpret_cast< QString(*)>(_a[1]))); break;
        case 1: localMenuDebug((*reinterpret_cast< QString(*)>(_a[1]))); break;
        case 2: localMenuRun((*reinterpret_cast< QString(*)>(_a[1])),(*reinterpret_cast< bool(*)>(_a[2]))); break;
        case 3: busyPlugin((*reinterpret_cast< QString(*)>(_a[1])),(*reinterpret_cast< QString(*)>(_a[2]))); break;
        case 4: universalOut01((*reinterpret_cast< QVariant(*)>(_a[1]))); break;
        .....

один в один то, что я написал...  Веселый
Записан

2^7-1 == 127, задумайтесь...
Old
Джедай : наставник для всех
*******
Online Online

Сообщений: 4349



Просмотр профиля
« Ответ #16 : Октябрь 16, 2014, 16:27 »

Подозреваю, что не будет работать по той же причине, что и пример в конце моего второго поста. Поскольку тут
Не правильно подозреваете. Это реальные файлы из тестового проекта, который работает.
Записан
Гурман
Гуру общения
******
Offline Offline

Сообщений: 1442

Qt 2.2, 3.3, 4.5, 4,7, 4.8, 5.3, 5.6, 5.9, 5.12


Просмотр профиля
« Ответ #17 : Октябрь 16, 2014, 16:33 »

Подозреваю, что не будет работать по той же причине, что и пример в конце моего второго поста. Поскольку тут
Не правильно подозреваете. Это реальные файлы из тестового проекта, который работает.

Хм. Тогда это весьма элегантное решение. Попробую у себя потом.
Записан

2^7-1 == 127, задумайтесь...
Old
Джедай : наставник для всех
*******
Online Online

Сообщений: 4349



Просмотр профиля
« Ответ #18 : Октябрь 16, 2014, 16:48 »

Хм. Тогда это весьма элегантное решение. Попробую у себя потом.
Ловите тогда тестовый проект целиком.
Записан
Гурман
Гуру общения
******
Offline Offline

Сообщений: 1442

Qt 2.2, 3.3, 4.5, 4,7, 4.8, 5.3, 5.6, 5.9, 5.12


Просмотр профиля
« Ответ #19 : Октябрь 16, 2014, 16:54 »

Хм. Тогда это весьма элегантное решение. Попробую у себя потом.
Ловите тогда тестовый проект целиком.


Спасибо, но мне вполне достаточно того, что реплике видно.  Смеющийся
Может кому-нибудь пригодится потом.
Записан

2^7-1 == 127, задумайтесь...
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #20 : Октябрь 16, 2014, 17:54 »

присваивается адрес метода некоего статического объекта, то и внутри этот метод получит указатель this на свой объект, а вовсе не на тот, в котором делается вызов (this->*func)( val );
Присваивается адрес не экземпляра, а типа (точнее метода), сохраненный адрес будет корректно вызываться для любого экземпляра такого типа или порожденного. Но не для др типа.
Записан
Гурман
Гуру общения
******
Offline Offline

Сообщений: 1442

Qt 2.2, 3.3, 4.5, 4,7, 4.8, 5.3, 5.6, 5.9, 5.12


Просмотр профиля
« Ответ #21 : Октябрь 16, 2014, 18:04 »

присваивается адрес метода некоего статического объекта, то и внутри этот метод получит указатель this на свой объект, а вовсе не на тот, в котором делается вызов (this->*func)( val );
Присваивается адрес не экземпляра, а типа (точнее метода), сохраненный адрес будет корректно вызываться для любого экземпляра такого типа или порожденного. Но не для др типа.

Я не говорил, что присваивается адрес экземпляра. Вызываться он будет, разумеется, но важно не это, а то, на какой экземпляр будет ему передаваться указатель this. В случае стандартного emit передается вовсе не указатель на объект, который сделал этот emit, а на объект, который был создан при присвоении. Но при прямом вызове, очевидно передается таки свой this.
Записан

2^7-1 == 127, задумайтесь...
m_ax
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2094



Просмотр профиля
« Ответ #22 : Октябрь 16, 2014, 18:20 »

Цитировать
но важно не это, а то, на какой экземпляр будет ему передаваться указатель this. В случае стандартного emit передается вовсе не указатель на объект, который сделал этот emit, а на объект, который был создан при присвоении. Но при прямом вызове, очевидно передается таки свой this.
Что то какой то несвязанный поток слов пошёл.. Ничего не понял, что хотели сказать..
Записан

Над водой луна двурога. Сяду выпью за Ван Гога. Хорошо, что кот не пьет, Он и так меня поймет..

Arch Linux Plasma 5
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #23 : Октябрь 16, 2014, 18:56 »

Я не говорил, что присваивается адрес экземпляра. Вызываться он будет, разумеется, но важно не это, а то, на какой экземпляр будет ему передаваться указатель this. В случае стандартного emit передается вовсе не указатель на объект, который сделал этот emit, а на объект, который был создан при присвоении.
При каком присвоении Непонимающий С точки зрения языка moc ничего не меняет. Макро emit пустое, чисто для понту. Сигнал - самый обычный метод, moc только создает тело. В этот метод передается this как и во все остальные. Др дело что пока дойдет до слота этого this уже не будет.

Я так и не понял что Вы хотели.
Записан
Гурман
Гуру общения
******
Offline Offline

Сообщений: 1442

Qt 2.2, 3.3, 4.5, 4,7, 4.8, 5.3, 5.6, 5.9, 5.12


Просмотр профиля
« Ответ #24 : Октябрь 16, 2014, 20:20 »

При присвоении адреса метода элементу массива.

Я делал так

Код:
typedef void ( *sox )( QVariant );

class CiControl : public QObject
{
...
private:
    sox sigarray[32];
...
signals:     
    void universalOut01(QVariant);
...
}

SEGINTERFACES* CiControl::getInterfaces()
{
...
    sigarray[0] = (sox) &CiControl::universalOut01;
...
}

int CiControl::universalSend( unsigned int i, Qvariant container )
{
...
    emit sigarray[ i ]( container );
...
}

падает глубоко внутри при входе в sigarray[ i ]( container ), то есть, в universalOut01(QVariant), и в отладчике при входе в эту функцию видно, что указатель this содержит адрес совсем не того объекта, который сделал emit, и да, того объекта уже нет, отладчик не показывает значения его свойств

вот почему при вызове sigarray[ i ]( container ) передается this не того объекта, который делает этот вызов, я не совсем понял
Записан

2^7-1 == 127, задумайтесь...
Old
Джедай : наставник для всех
*******
Online Online

Сообщений: 4349



Просмотр профиля
« Ответ #25 : Октябрь 16, 2014, 20:24 »

Это
Код
C++ (Qt)
typedef void ( *sox )( QVariant );
совсем не указатель на метод класса.

И так присваивать нельзя.
Код
C++ (Qt)
sigarray[0] = (sox) &CiControl::universalOut01;

Не нужно в c++ использовать сишные касты. Вот вы получили за это по рукам.
Записан
Гурман
Гуру общения
******
Offline Offline

Сообщений: 1442

Qt 2.2, 3.3, 4.5, 4,7, 4.8, 5.3, 5.6, 5.9, 5.12


Просмотр профиля
« Ответ #26 : Октябрь 16, 2014, 20:36 »

Это
Код
C++ (Qt)
typedef void ( *sox )( QVariant );
совсем не указатель на метод класса.


А! Точно. Это моя ошибка. Надо было typedef внутри класса делать, с указанием его имени. Тогда заработает.
Записан

2^7-1 == 127, задумайтесь...
Old
Джедай : наставник для всех
*******
Online Online

Сообщений: 4349



Просмотр профиля
« Ответ #27 : Октябрь 16, 2014, 20:38 »

Надо было typedef внутри класса делать, с указанием его имени.
Не обязательно внутри класса, но обязательно с именем класса.
Записан
Гурман
Гуру общения
******
Offline Offline

Сообщений: 1442

Qt 2.2, 3.3, 4.5, 4,7, 4.8, 5.3, 5.6, 5.9, 5.12


Просмотр профиля
« Ответ #28 : Октябрь 16, 2014, 20:44 »

Надо было typedef внутри класса делать, с указанием его имени.
Не обязательно внутри класса, но обязательно с именем класса.

имя становится известно внутри класса, иначе надо отдельно класс-пустышку объявлять, так что лучше всего внутри Подмигивающий

только что проверил:

Код:
Код:

class CiControl : public QObject
{
...
private:
    typedef void (CiControl::*sox)( QVariant );
    sox sigarray[32];
...
signals:    
    void universalOut01(QVariant);
...
}

SEGINTERFACES* CiControl::getInterfaces()
{
...
    sigarray[0] = &CiControl::universalOut01;
...
}

int CiControl::universalSend( unsigned int i, QVariant container )
{
...
    emit (this->*sigarray[ i ])( container );
...
}

Работает. Тему можно закрыть.

ЗЫ: Вот это еще бы как-то более человечно сделать:

Код:
    sigarray[0] = &CiControl::universalOut01;
    sigarray[1] = &CiControl::universalOut02;
    sigarray[2] = &CiControl::universalOut03;
    .........
    .........
    .........

надо завтра попробовать через QMetaMethod
« Последнее редактирование: Октябрь 16, 2014, 21:02 от Гурман » Записан

2^7-1 == 127, задумайтесь...
Страниц: 1 [2]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.132 секунд. Запросов: 23.