Russian Qt Forum

Qt => Общие вопросы => Тема начата: Anonymous от Февраль 17, 2005, 12:32



Название: Народ, помогите понять ...
Отправлено: Anonymous от Февраль 17, 2005, 12:32
Как организовать обмен сигналами/событиями между виджетами, которые не находятся в одной области видимости?
Т.е. к примеру открывается в приложении два разных окна, по закрытии одного из них в другом чего нибудь происходит (update() к примеру какой-нибудь).

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

QApplication::sendEvent(qApp, e),

т.е. в качестве receiver использовать само приложение - виджеты из приложения  не реагируют не фига.
Чего-то я не понимаю.


Название: Народ, помогите понять ...
Отправлено: Sergeich от Февраль 17, 2005, 14:56
Что значит не в одной области видимости? В разных адресных пространствах (разных процессах)? или как?

Вместо QApplication::sendEvent() лучше использовать QApplication::postEvent(), она thread-safe. Вообще-то и sendEvent() должен работать, возможно у тебя какие-то косяки в обработчике событий.


Название: Народ, помогите понять ...
Отправлено: Anonymous от Февраль 17, 2005, 16:36
Не в одной области видимости имеется ввиду с точки зрения переменных С++.
Не знаю как это терминологически правильно сказать.

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

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

у меня нет этого самого receiver как объекта в данном классе (виджете), т.к.  мне нужно отослать сигнал /событие совсем в другой объект-приемник (несколько разных объектов-приемников), который никак не связан с объектом-инициатором события если не считать того, что они находятся в одном приложении QApplication.


Название: Народ, помогите понять ...
Отправлено: Sergeich от Февраль 17, 2005, 16:59
Тогда разошли событие всем окнам ( см. QApplication::topLevelWidgets() )


Название: Народ, помогите понять ...
Отправлено: Anonymous от Февраль 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 от Февраль 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 от Февраль 21, 2005, 14:41
Да, действительно, все работает ...
Значит буду искать у себя ошибку.
Спасибо!