Russian Qt Forum

Qt => Общие вопросы => Тема начата: Авварон от Март 17, 2011, 00:26



Название: emit сигнала
Отправлено: Авварон от Март 17, 2011, 00:26
Нормально ли эмитить сигнал void keyChanged(const QString &key); _до_ смены значения key?:
Код:
void Edition::setKey(const QString &key)
{
    Q_D(Edition);

    if (d->key != key) {
        emit keyChanged(key);
        d->key = key;
    }
}
Нужно для имплементации другого класса знать старое значение ключа, чтобы сменить в мапе. Можно получить из самой мапы, но как-то медленно. Что правильней?


Название: Re: emit сигнала
Отправлено: asvil от Март 17, 2011, 00:40
void keyChanged(old, new)?

Postscriptum: void keyChanged(new, old)? Можно приконнектить однопараметровый слот.


Название: Re: emit сигнала
Отправлено: Пантер от Март 17, 2011, 00:42
А если keyChanged(const QString &oldKey, const QString &newKey)?

Опередил. :)


Название: Re: emit сигнала
Отправлено: Авварон от Март 17, 2011, 00:44
а со скриптами оно будет дружить? там в NOTIFY секцию не однопараметровый ли сигнал надо?
Так бы и сделал бы, просто скриптовость останавливает


Название: Re: emit сигнала
Отправлено: Пантер от Март 17, 2011, 00:45
Ну, а ежели 2 сигнала?


Название: Re: emit сигнала
Отправлено: Авварон от Март 17, 2011, 00:51
А это уже криво) Имплементация торчит наружу. в принципе там скорость не критична. А можно и обратную мапу забабахать. Однако ж интересны мнения, как написать "красиво".


Название: Re: emit сигнала
Отправлено: asvil от Март 17, 2011, 00:52
Две проперти?


Название: Re: emit сигнала
Отправлено: Авварон от Март 17, 2011, 00:56
Оригинально:) Но тоже криво. Что 2й сигнал, что 2я пропертя бесполезны всему остальному приложению, они нужны только 2му классу (пусть будет в дальнейшем Base), к-ый содержит мапу.


Название: Re: emit сигнала
Отправлено: asvil от Март 17, 2011, 01:16
Немного не в тему, но мощно. Звучит примерно так:
Каждый QObject-based класс должен реализовывать сигнал propertyChanged(propertyName, newValue, oldValue).

Ради одного класса лучше пренебречь красотой. Или патчик moc.


Название: Re: emit сигнала
Отправлено: _govorilka от Март 17, 2011, 08:13
Ты можешь посылать в сигнале структуру. Тогда если тебе понадобиться еще один параметр, ты просто добавишь поле в эту структуру и тебе не придется переделывать сигнал. Если под скриптами - подразумеваешь QScript, то добавить структуру в скрипт не сложно (в библиотеки есть соотвествующие примеры).


Название: Re: emit сигнала
Отправлено: Авварон от Март 17, 2011, 12:06
Не, меня декларатив интересует. Это там ограничение на сигнатуру кажется присутствует. В кьютскрипт любой сигнал можно подцепить.


Название: Re: emit сигнала
Отправлено: Mikhail от Март 17, 2011, 20:07
Скрипты могут получать сигналы более чем с одним параметром.
Главное создать в скрипте слот с требуемым числом параметров.
Проверено на опыте. Работает


Название: Re: emit сигнала
Отправлено: Авварон от Март 17, 2011, 20:59
вы про qml?


Название: Re: emit сигнала
Отправлено: Sahab от Март 18, 2011, 10:37
Цитировать
http://www.anyqsoft.com
<offtop>the sexadecimal editor written completely on Qt</offtop>


Название: Re: emit сигнала
Отправлено: twp от Март 18, 2011, 13:20
если я правильно понял, был установлен кастом виджет в QML сцену через QGraphicsProxyWidget и регистрацию QML_DECLARE_TYPE. Тогда можно не использовать стандартный сигнал в секции NOTIFY декларации Q_PROPERTY (но можно и оставить как сигнал для стандартной реализации) и добавить сигнал с двумя параметрами как было предложено выше. В QML-коде его можно перехватить как обычный сигнал на изменение проперти


Название: Re: emit сигнала
Отправлено: Mikhail от Март 18, 2011, 15:20
вы про qml?

Нет я именно про скрипты. Ведь qml это не скрипты.


Название: Re: emit сигнала
Отправлено: Авварон от Март 19, 2011, 00:01
ну а вот в qml это работать по идее не будет.


Название: Re: emit сигнала
Отправлено: twp от Март 21, 2011, 12:52
ну почему, должно работать


Название: Re: emit сигнала
Отправлено: Авварон от Март 21, 2011, 14:41
почитал доку, да, там нет ограничения на 1 параметр для NOTIFY сигнала.


Название: Re: emit сигнала
Отправлено: twp от Март 21, 2011, 16:06
в qml сигнал будет работать даже если не указывать в NOTIFY. Т.е. можно добавить любой сигнал с любым числом параметров и он будет работать для qml. Например в examples\tutorials\gettingStarted\gsQml\filedialog\directory.h
есть сигнал Directory::directoryChanged() не задекларированный в NOTIFY, однако он используется в examples\tutorials\gettingStarted\gsQml\core\fileMenu.qml :
Код:
    Directory {
        id:directory
        filename: textInput.text
        onDirectoryChanged:fileDialog.notifyRefresh()
    }


Название: Re: emit сигнала
Отправлено: Авварон от Март 21, 2011, 16:21
это не то. я биндинги имел ввиду.