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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: Народ, помогите понять ...  (Прочитано 9003 раз)
Anonymous
Гость
« : Февраль 17, 2005, 12:32 »

Как организовать обмен сигналами/событиями между виджетами, которые не находятся в одной области видимости?
Т.е. к примеру открывается в приложении два разных окна, по закрытии одного из них в другом чего нибудь происходит (update() к примеру какой-нибудь).

  попробовал используя QCustomEvent отсылать вот так

QApplication::sendEvent(qApp, e),

т.е. в качестве receiver использовать само приложение - виджеты из приложения  не реагируют не фига.
Чего-то я не понимаю.
Записан
Sergeich
Гость
« Ответ #1 : Февраль 17, 2005, 14:56 »

Что значит не в одной области видимости? В разных адресных пространствах (разных процессах)? или как?

Вместо QApplication::sendEvent() лучше использовать QApplication::postEvent(), она thread-safe. Вообще-то и sendEvent() должен работать, возможно у тебя какие-то косяки в обработчике событий.
Записан
Anonymous
Гость
« Ответ #2 : Февраль 17, 2005, 16:36 »

Не в одной области видимости имеется ввиду с точки зрения переменных С++.
Не знаю как это терминологически правильно сказать.

Т.е. при использовании

sendEvent(QObject * receiver, ...) или пускай postEvent(QObject * receiver, ...)

у меня нет этого самого receiver как объекта в данном классе (виджете), т.к.  мне нужно отослать сигнал /событие совсем в другой объект-приемник (несколько разных объектов-приемников), который никак не связан с объектом-инициатором события если не считать того, что они находятся в одном приложении QApplication.
Записан
Sergeich
Гость
« Ответ #3 : Февраль 17, 2005, 16:59 »

Тогда разошли событие всем окнам ( см. QApplication::topLevelWidgets() )
Записан
Anonymous
Гость
« Ответ #4 : Февраль 17, 2005, 18:16 »

Если имеется ввиду вот так


CustomEvent * e = new CustomEvent();

QWidgetList  *list = QApplication::topLevelWidgets();

    QWidgetListIt it( *list );        
   QWidget * w;
    while ( (w=it.current()) != 0 ) {  
        ++it;
      QApplication::postEvent( w, e );
     
    }
    delete list;

То это не работает.
Такое ощущение, что Qt в этом случае не видит перегруженные методы. (не понимаю почему) Т.е. найдя виджет

 QWidget * w;

из списка, я получаю доступ к методам и объектам класса QWidget, но не производного класса. А ведь у меня то мое окошко – это производный чайлд от QWidget и перегруженная процедура customEvent, которая ловит событие е, находится как раз в чайлде.
Грустный
Чего-то я не понимаю, вроде дело то простое - обмен между окошками.
Записан
Sergeich
Гость
« Ответ #5 : Февраль 17, 2005, 20:45 »

Написал тестик:
Код:

#include <qlabel.h>
#include <qapplication.h>
#include <qwidgetlist.h>

class MyWidget : public QLabel
{
public:
MyWidget() : QLabel( "", 0, "MyWidget" ), cnt(0) { resize( 200, 50 ); }
void customEvent( QCustomEvent* ) {
cnt++;
setText( QString( "Counter : %1" ).arg(cnt) );
}
void mousePressEvent( QMouseEvent* ) {
QWidgetList *list = QApplication::topLevelWidgets();
QWidgetListIt it( *list );
QWidget *w;
while ( (w=it.current()) != 0 ) {
++it;
QApplication::postEvent( w, new QCustomEvent( 1001 ) );
}
delete list;
}
private:
int cnt;
};

int main( int argc, char** argv )
{
QApplication app( argc, argv );
MyWidget w1, w2;
w1.show();
w2.show();
QObject::connect( &app, SIGNAL( lastWindowClosed() ), &app, SLOT( quit() ) );
return app.exec();
}

Все работает!!! и под виндой и под линухом!!!
 Проверь свой код.
Записан
Ed
Гость
« Ответ #6 : Февраль 21, 2005, 14:41 »

Да, действительно, все работает ...
Значит буду искать у себя ошибку.
Спасибо!
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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