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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: [Qt-3.3.4] Вопрос о событиях  (Прочитано 3591 раз)
Kosh
Гость
« : Май 08, 2007, 15:48 »

в главном окне есть очень много виджетов, в том числе и вложенных друг в друга. Как послать событие, не конкретному виджету, а пустить через всех, чтобы, кому нужно получили и обработали его?
Записан
pakulo
Гость
« Ответ #1 : Май 09, 2007, 12:25 »

В принципе можно было бы получить указатели на все виджеты и через цикл послать событие. Но каждый виджет имеет свои события, поэтому не выйдет так. Только если у тебя виджеты не одного типа. Или можно проверять тип виджет и вызывать нужно событие. А так лучше послать сигнал.
Записан
Kosh
Гость
« Ответ #2 : Май 10, 2007, 09:57 »

Цитата: "pakulo"
А так лучше послать сигнал.

Для этого виджеты, посылающие сигнал надо делать глобальными, чтобы коннектиться к ним, тоже по-дурацки выглядит. Разве что, завести глобальный объект передатчик. Одни виджеты будут к нему коннектиться, чтобы передать сигнал, а другие, чтобы принять сигнал. Интересно, кто-нибуть иакими извратами занимался?
Записан
Alex03
Гость
« Ответ #3 : Май 10, 2007, 11:20 »

Можно по аналогии с рассылкой LanguageChange сделать.
Код:
void QApplication::installTranslator( QTranslator * mf )
{
    ...
    ...
    ...
    QWidgetList *list = topLevelWidgets();
    QWidgetListIt it( *list );
    QWidget *w;
    while ( ( w=it.current() ) != 0 ) {
        ++it;
        if (!w->isDesktop())
            postEvent( w, new QEvent( QEvent::LanguageChange ) );
    }
    delete list;


Код:
bool QWidget::event( QEvent *e )
{
    if ( QObject::event( e ) )
return TRUE;

    switch ( e->type() ) {
    ...
    ...
    ...
    case QEvent::LanguageChange:
    case QEvent::LocaleChange:
        if ( children() ) {
            QObjectListIt it( *children() );
            QObject *o;
            while( ( o = it.current() ) != 0 ) {
                ++it;
                QApplication::sendEvent( o, e );
            }
        }
        if ( e->type() == QEvent::LanguageChange ) {
            int index = metaObject()->findSlot( "languageChange()", TRUE );
            if ( index >= 0 )
                qt_invoke( index, 0 );
            }
        update();
        break;
    ...
    ...
    ...
    default:
        return FALSE;
    }
    return TRUE;
}
Записан
Kosh
Гость
« Ответ #4 : Май 10, 2007, 15:18 »

Alex03, спасибо, я посмотрю этот вариант. А пока неплохо обошлась маленьким глобальным объектиком.
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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