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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: Signal destroyed() и sender() в слоте  (Прочитано 2370 раз)
Fregloin
Супер
******
Offline Offline

Сообщений: 1025


Просмотр профиля
« : Январь 23, 2014, 12:57 »

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

Код:
class CViewToModelLink  :   public  QObject
{
    CRailObject                     *   frailObject;
public:
    void                    setRailObject(CRailObject   *   RailObject);
private slots:
    void    destroyRailObjectHandler();
};

void CViewToModelLink::setRailObject(CRailObject *RailObject)
{
    if(frailObject!=RailObject)
    {
        if(frailObject)
            disconnect(frailObject,SIGNAL(destroyed()),this,SLOT(destroyRailObjectHandler()));
        frailObject = RailObject;
        if(frailObject)
            connect(frailObject,SIGNAL(destroyed()),this,SLOT(destroyRailObjectHandler()));
    }
}

void CViewToModelLink::destroyRailObjectHandler()
{
    CRailObject *   railObject = qobject_cast<CRailObject*>(sender()); //<<на момент удаления в sender() есть указатель на QObject, но на CRailObject он не кастится
    qDebug("remove %s object from link",qPrintable(railObject->objectName())); //соответсвенно тут вылет
    frailObject = NULL;
}

Суть в том, что раньше руками везде я указывал при удалении объекта railObject для объекта CViewToModelLink стереть указатель на него. Решил переделать на сигнал/слоты.
И вот при сигнале destroyed() при удалении railObject я не могу узнать какой объект удалился. точнее я не могу его привести с нужному типу. Или на момент посылки сигнала destroyed() все деструкторы вызваны, и преобразования к наследуемому типу уже невозможно?
Записан
Old
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4350



Просмотр профиля
« Ответ #1 : Январь 23, 2014, 13:11 »

Или на момент посылки сигнала destroyed() все деструкторы вызваны, и преобразования к наследуемому типу уже невозможно?
На сколько я помню да, сигнал destroyed посылается из деструктора QObjetc, когда деструкторы наследников уже отработали.
Записан
Swa
Самовар
**
Offline Offline

Сообщений: 170


Просмотр профиля
« Ответ #2 : Январь 23, 2014, 13:31 »

Или на момент посылки сигнала destroyed() все деструкторы вызваны, и преобразования к наследуемому типу уже невозможно?
Да.

Но так как у вас со слотом destroyRailObjectHandler соединяется сигнал только одного объекта, зачем делать каст?

Это можно обойти если в классе CRailObject воздать свой сигнал, например
Код:
signals:
void CRailObject::CRailObjectOnDestroy();
и вызывать его из деструктора CRailObject. Тогда каст сработает.
Записан
Fregloin
Супер
******
Offline Offline

Сообщений: 1025


Просмотр профиля
« Ответ #3 : Январь 23, 2014, 13:35 »

это я так и понял, что можно вызывать из деструктора свой сигнал.
по поводу каста, помимо этого объекта, есть еще хеш с другими объектами. и при удалении одного из них, нужно убрать указатель из хеша...
но я сделал через static_cast

Код:
void CViewToModelLink::destroyViewItemHandler()
{
    QRailItem *   viewItem = static_cast<QRailItem*>(sender());
    if(viewItem) //удаляем по указателю
        removeViewItem(viewItem);
}

void CViewToModelLink::removeViewItem(QRailItem *GraphicsObject)
{
    for(QHash<CInterfaceTag,QRailItem*>::iterator iterator=fviewHash.begin();iterator!=fviewHash.end();++iterator)
    {
        if(iterator.value()==GraphicsObject)
        {
            iterator = fviewHash.erase(iterator);
            break;
        }
    }
}
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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