Название: Как сделать сигнал дочернего виджета достоянием всего класса Отправлено: L.Marvell от Март 22, 2006, 16:15 Создаю клас SomeClass наследник QWidget. В нем создаются разнообразные виджеты, один из которых QLineEdit в секции private. Вопрос: можно ли пропускать его (QLineEdit'a) сигналы так, чтобы в программе можно было писать например:
Код:
Единственное, что пришло в голову внутри SomeClass коннектить нужный сигнал QLineEdit'a к собственному слоту из которого в свою очередь выпускать собственный похожий сигнал. Но как-то не хорошо это. Название: Как сделать сигнал дочернего виджета достоянием всего класса Отправлено: Hordi от Март 22, 2006, 16:35 Три раза прочитал и не понял... Или я отупел совсем...
Отвечу наугад: 1.Параметры слота и сигнала должны быть одинаковые. 2.Можно работать через сообщения (QEvent), но сообщения - это совсем другой механизм, в отличие от слотов (слоты это в общем-то callback функции). Сообщения можно перехватить в QApplication и там решить кому их направить (или изменять и что-то с ними делать) 3.Можно параметр сделать универсальным типом (как QVariant) Название: Re: Как сделать сигнал дочернего виджета достоянием всего кл Отправлено: comrade от Март 22, 2006, 16:49 Цитата: "L.Marvell" коннектить нужный сигнал QLineEdit'a к собственному слоту из которого в свою очередь выпускать собственный похожий сигнал. яб так и сделал. а чем не хорошо то? Название: Re: Как сделать сигнал дочернего виджета достоянием всего кл Отправлено: L.Marvell от Март 22, 2006, 16:58 Цитата: "comrade" Цитата: "L.Marvell" коннектить нужный сигнал QLineEdit'a к собственному слоту из которого в свою очередь выпускать собственный похожий сигнал. яб так и сделал. а чем не хорошо то? Хм... ну не хорошо в случае, если можно сделать как-то проще, если нет, тогда хорошо :) Я в принципе так и сделал, но потом подумал "а вдруг...". Вот и решил спросить. Название: Re: Как сделать сигнал дочернего виджета достоянием всего кл Отправлено: Sergeich от Март 22, 2006, 17:14 Цитата: "L.Marvell" коннектить нужный сигнал QLineEdit'a к собственному слоту из которого в свою очередь выпускать собственный похожий сигнал А кто мешает в родительском классе описать такой же сигнал, и приконнектить сигнал к сигналу. Название: Как сделать сигнал дочернего виджета достоянием всего класса Отправлено: L.Marvell от Март 22, 2006, 17:25 2 Hordi
Есть класс: Код:
Используем где-то: Код:
Отсюда выход (тот что вижу я): SomeClass.h Код:
SomeClass.cpp Код:
Вот теперь у SomeClass есть сигнал textChanged() и его можно использовать. Но я подумал может можно как-то проще это сделать. Название: Как сделать сигнал дочернего виджета достоянием всего класса Отправлено: Sergeich от Март 22, 2006, 17:27 connect(le, SIGNAL(textChanged(const QString&)), this,SIGNAL(textChanged(const QString&)));
Название: Re: Как сделать сигнал дочернего виджета достоянием всего кл Отправлено: L.Marvell от Март 22, 2006, 17:35 Цитата: "Sergeich" Цитата: "L.Marvell" коннектить нужный сигнал QLineEdit'a к собственному слоту из которого в свою очередь выпускать собственный похожий сигнал А кто мешает в родительском классе описать такой же сигнал, и приконнектить сигнал к сигналу. Видимо соображаловка :oops: Спасибо! Название: Как сделать сигнал дочернего виджета достоянием всего класса Отправлено: Hordi от Март 22, 2006, 17:36 2L.Marvell:
Теперь понял. То, что ты предлагаешь ИМХО наиболее правильный путь. Название: Как сделать сигнал дочернего виджета достоянием всего класса Отправлено: comrade от Март 22, 2006, 21:17 Цитата: "Sergeich" connect(le, SIGNAL(textChanged(const QString&)), this,SIGNAL(textChanged(const QString&))); ухты, зачётно! не знал, что так можно Название: Как сделать сигнал дочернего виджета достоянием всего класса Отправлено: Steven_Orko от Март 22, 2006, 23:42 Цитата: "comrade" Цитата: "Sergeich" connect(le, SIGNAL(textChanged(const QString&)), this,SIGNAL(textChanged(const QString&))); ухты, зачётно! не знал, что так можно Например, про это написано в книге Бланшета, а также в топике в Assistant про слоты и сигналы. ))) Название: Как сделать сигнал дочернего виджета достоянием всего класса Отправлено: yshurik от Март 23, 2006, 01:33 Цитата: "comrade" Цитата: "Sergeich" connect(le, SIGNAL(textChanged(const QString&)), this,SIGNAL(textChanged(const QString&))); ухты, зачётно! не знал, что так можно Ну вы блин даёте... Теперь можете удалить процентов 10 слотов из вашего софта. Шутка. Название: Как сделать сигнал дочернего виджета достоянием всего класса Отправлено: comrade от Март 23, 2006, 13:11 Цитата: "Steven_Orko" Например, про это написано в книге Бланшета, а также в топике в Assistant про слоты и сигналы. ))) кто такой Бланшет к сожалению не знаю, а в Assistant'е такую конструкцию вупор не нешел :( где смотреть то надо? расскажи, а? может там еще что интересненькое... Название: Как сделать сигнал дочернего виджета достоянием всего класса Отправлено: Arlekino от Март 23, 2006, 13:12 Думаю, что класс QSignalMapper поможет в этом случае.
См. документацию по QT 4.1 Название: Как сделать сигнал дочернего виджета достоянием всего класса Отправлено: Вудруф от Март 24, 2006, 08:09 Книга Бланшет выложена на trolltech.com (да и на qtlib.ru вроде).
В Ассистанте: Home -> Signals and Slots -> Signals and Slots: It is even possible to connect a signal directly to another signal. (This will emit the second signal immediately whenever the first is emitted.) Также эта возможность показана в описании функции QObject::connect: bool QObject::connect ( const QObject * sender, const char * signal, const QObject * receiver, const char * method, Qt::ConnectionType type = Qt::AutoCompatConnection ) Creates a connection of the given type from the signal in the sender object to the method in the receiver object. Returns true if the connection succeeds; otherwise returns false. You must use the SIGNAL() and SLOT() macros when specifying the signal and the method ... A signal can also be connected to another signal ... connect(myButton, SIGNAL(clicked()), this, SIGNAL(buttonClicked())) Так что надо всего лишь чуть-чуть поискать |