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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: Как сделать сигнал дочернего виджета достоянием всего класса  (Прочитано 8300 раз)
L.Marvell
Гость
« : Март 22, 2006, 16:15 »

Создаю клас SomeClass наследник QWidget. В нем создаются разнообразные виджеты, один из которых QLineEdit в секции private. Вопрос: можно ли пропускать его (QLineEdit'a) сигналы так, чтобы в программе можно было писать например:
Код:

connect(SomeClass, SIGNAL(textChanged(...)), someObj, SLOT(someSlot()));

Единственное, что пришло в голову внутри SomeClass коннектить нужный сигнал QLineEdit'a к собственному слоту из которого в свою очередь выпускать собственный похожий сигнал. Но как-то не хорошо это.
Записан
Hordi
Гость
« Ответ #1 : Март 22, 2006, 16:35 »

Три раза прочитал и не понял... Или я отупел совсем...
Отвечу наугад:
1.Параметры слота и сигнала должны быть одинаковые.
2.Можно работать через сообщения (QEvent), но сообщения - это совсем другой механизм, в отличие от слотов (слоты это в общем-то callback функции). Сообщения можно перехватить в QApplication и там решить кому их направить (или изменять и что-то с ними делать)
3.Можно параметр сделать универсальным типом (как QVariant)
Записан
comrade
Гость
« Ответ #2 : Март 22, 2006, 16:49 »

Цитата: "L.Marvell"
коннектить нужный сигнал QLineEdit'a к собственному слоту из которого в свою очередь выпускать собственный похожий сигнал.

яб так и сделал. а чем не хорошо то?
Записан
L.Marvell
Гость
« Ответ #3 : Март 22, 2006, 16:58 »

Цитата: "comrade"
Цитата: "L.Marvell"
коннектить нужный сигнал QLineEdit'a к собственному слоту из которого в свою очередь выпускать собственный похожий сигнал.

яб так и сделал. а чем не хорошо то?

Хм... ну не хорошо в случае, если можно сделать как-то проще, если нет, тогда хорошо Улыбающийся Я в принципе так и сделал, но потом подумал "а вдруг...". Вот и решил спросить.
Записан
Sergeich
Гость
« Ответ #4 : Март 22, 2006, 17:14 »

Цитата: "L.Marvell"
коннектить нужный сигнал QLineEdit'a к собственному слоту из которого в свою очередь выпускать собственный похожий сигнал

А кто мешает в родительском классе описать такой же сигнал, и приконнектить сигнал к сигналу.
Записан
L.Marvell
Гость
« Ответ #5 : Март 22, 2006, 17:25 »

2 Hordi

Есть класс:
Код:

class SomeClass : public QWidget
{
     public:
          ...
     private:
          ...
          QLineEdit *le;
}


Используем где-то:
Код:

SomeClass *sc = new SomeClass;

// Нужно чтобы что-то происходило когда меняется текст в le, но поскольку доступа к le нет, то нужно писать следующее

connect(sc, SIGNAL(textChanged(), this, SLOT(someSlot()));

// Ошибка. Т.к. у sc нет сигнала textChanged()

Отсюда выход (тот что вижу я):

SomeClass.h
Код:

class SomeClass : public QWidget
{
     public:
          ...
     private:
          ...
          QLineEdit *le;
     private slots:
          void emitTextChangedSignal(const QString&);
     signals:
          textChanged(const QString&);
}


SomeClass.cpp
Код:

SomeClass::SomeClass(...)
{
     connect(le, SIGNAL(textChanged(const QString&)), this, SLOT(emitTextChangedSignal(const QString&)));
     ...
}

void SomeClass::emitTextChangedSignal(const QString& string)
{
     emit textChanged(string);
}


Вот теперь у SomeClass есть сигнал textChanged() и его можно использовать. Но я подумал может можно как-то проще это сделать.
Записан
Sergeich
Гость
« Ответ #6 : Март 22, 2006, 17:27 »

connect(le, SIGNAL(textChanged(const QString&)), this,SIGNAL(textChanged(const QString&)));
Записан
L.Marvell
Гость
« Ответ #7 : Март 22, 2006, 17:35 »

Цитата: "Sergeich"
Цитата: "L.Marvell"
коннектить нужный сигнал QLineEdit'a к собственному слоту из которого в свою очередь выпускать собственный похожий сигнал

А кто мешает в родительском классе описать такой же сигнал, и приконнектить сигнал к сигналу.

Видимо соображаловка :oops: Спасибо!
Записан
Hordi
Гость
« Ответ #8 : Март 22, 2006, 17:36 »

2L.Marvell:
Теперь понял. То, что ты предлагаешь ИМХО наиболее правильный путь.
Записан
comrade
Гость
« Ответ #9 : Март 22, 2006, 21:17 »

Цитата: "Sergeich"
connect(le, SIGNAL(textChanged(const QString&)), this,SIGNAL(textChanged(const QString&)));

ухты, зачётно! не знал, что так можно
Записан
Steven_Orko
Гость
« Ответ #10 : Март 22, 2006, 23:42 »

Цитата: "comrade"
Цитата: "Sergeich"
connect(le, SIGNAL(textChanged(const QString&)), this,SIGNAL(textChanged(const QString&)));

ухты, зачётно! не знал, что так можно

Например, про это написано в книге Бланшета, а также в топике в Assistant про слоты и сигналы. )))
Записан
yshurik
Гость
« Ответ #11 : Март 23, 2006, 01:33 »

Цитата: "comrade"
Цитата: "Sergeich"
connect(le, SIGNAL(textChanged(const QString&)), this,SIGNAL(textChanged(const QString&)));

ухты, зачётно! не знал, что так можно


Ну вы блин даёте...
Теперь можете удалить процентов 10 слотов из вашего софта.

        Шутка.
Записан
comrade
Гость
« Ответ #12 : Март 23, 2006, 13:11 »

Цитата: "Steven_Orko"

Например, про это написано в книге Бланшета, а также в топике в Assistant про слоты и сигналы. )))

кто такой Бланшет к сожалению не знаю, а в Assistant'е такую конструкцию вупор не нешел Грустный  где смотреть то надо? расскажи, а? может там еще что интересненькое...
Записан
Arlekino
Гость
« Ответ #13 : Март 23, 2006, 13:12 »

Думаю, что класс QSignalMapper поможет в этом случае.
См. документацию по QT 4.1
Записан
Вудруф
Гость
« Ответ #14 : Март 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()))

Так что надо всего лишь чуть-чуть поискать
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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