Russian Qt Forum

Qt => Общие вопросы => Тема начата: deaks от Декабрь 23, 2010, 11:57



Название: QSignalMapper. вызов слота
Отправлено: deaks от Декабрь 23, 2010, 11:57
Здравствуйте,
делал по примеру в ассистанте
Код:
QSignalMapper *signalMapper = new QSignalMapper(this);

        QString tmpStr = "cur";

        QAction *act = new QAction(tmpStr, this);
        ui->menLoad->addAction(act);
        signalMapper->setMapping(act, QString(tmpStr));
        connect(act, SIGNAL(triggered()), signalMapper, SLOT(map()));
        connect(signalMapper, SIGNAL(mapped(QWidget*)), this, SLOT(loadCustomProject(QWidget*)));

и соответственно в слоте:
Код:
    QAction *act = dynamic_cast<QAction*>(widget);
    act->setText("new");

Но в итоге в слот не заходит. Где мог закрасться косяк?))


Название: Re: QSignalMapper. вызов слота
Отправлено: alexman от Декабрь 23, 2010, 12:14
Q_OBJECT указал?


Название: Re: QSignalMapper. вызов слота
Отправлено: deaks от Декабрь 23, 2010, 12:20
вы имеете в виду в описание класса? конечно


Название: Re: QSignalMapper. вызов слота
Отправлено: twp от Декабрь 23, 2010, 12:24
Установка маппинга со строкой:
Код:
signalMapper->setMapping(act, QString(tmpStr));
А параметр как виджет?
Код:
connect(signalMapper, SIGNAL(mapped(QWidget*)), this, SLOT(loadCustomProject(QWidget*)));


Название: Re: QSignalMapper. вызов слота
Отправлено: deaks от Декабрь 23, 2010, 12:27
пардон, экспериментировал, но при этом так же результата не наблюдается

signalMapper->setMapping(act, act);


Название: Re: QSignalMapper. вызов слота
Отправлено: twp от Декабрь 23, 2010, 12:29
act не виджет а значит будет испукаться другой сигнал: mapped ( QObject * object )


Название: Re: QSignalMapper. вызов слота
Отправлено: deaks от Декабрь 23, 2010, 12:31
в общем, вместо QWidget поставил QObject и все заработало ;)

Большое спасибо ;)


Название: Re: QSignalMapper. вызов слота
Отправлено: deaks от Декабрь 23, 2010, 12:31
twp,
я как раз так и сделал)спасибо!


Название: Re: QSignalMapper. вызов слота
Отправлено: twp от Декабрь 23, 2010, 12:33
в таком случае я вообще не вижу смысл использования QSignalMapper с таким маппингом:
Код:
signalMapper->setMapping(act, act);
или это чисто ради эксперимента?


Название: Re: QSignalMapper. вызов слота
Отправлено: deaks от Декабрь 23, 2010, 14:00
почему же нет смысла?

как это можно сделать кроме как через мэппинг или QObject->sender()?


Название: Re: QSignalMapper. вызов слота
Отправлено: twp от Декабрь 23, 2010, 15:15
почему же нет смысла?

как это можно сделать кроме как через мэппинг или QObject->sender()?
Точно, в слоте можно получить отправителя сигнала через QObject::sender(), этот метод работает только в слоте, подоробнее лучше узнать в асистенте. Кроме того вместо dynamic_cast предпочтительней использовать qobject_cast


Название: Re: QSignalMapper. вызов слота
Отправлено: deaks от Декабрь 23, 2010, 15:21
именно тут на форуме читал про то, что надо вместо получения отправителя, надо использовать мэппинг, по крайней мере это отвечает идеологии mvc)


Название: Re: QSignalMapper. вызов слота
Отправлено: twp от Декабрь 24, 2010, 11:57
Интресное мнение  :) Вообще-то к идеалогии mvc механизм сигнал-слотов не относится, просто в Qt механизм оповещений представлений о изменениях в модели основан на этом механизме. Тем более не относится к mvc QSignalMapper. Это довольно узко-специализированный класс