crossplatform.ru

Здравствуйте, гость ( Вход | Регистрация )


  Ответ в Всплывающие окна
Введите ваше имя
Подтвердите код

Введите в поле код из 6 символов, отображенных в виде изображения. Если вы не можете прочитать код с изображения, нажмите на изображение для генерации нового кода.
Теги
Выровнять по центру
Ссылка на тему
Ссылка на сообщение
Скрытый текст
Сокращение
Код с подсветкой
Offtopic
 
Удалить форматирование
Спец. элементы
Шрифт
Размер
 
Цвет шрифта
 
Отменить ввод
Вернуть ввод
Полужирный
Курсив
Подчеркнутый
 
 
Смайлики
Вставить изображение
Вставить адрес электронной почты
Цитата
Код
Раскрывающийся текст
 
Увеличить отступ
По левому краю
По центру
По правому краю
Вставить список
Вставить список

Опции сообщения
 Включить смайлы?
Иконки сообщения
(Опционально)
                                
                                
  [ Без иконки ]
 


Последние 10 сообщений [ в обратном порядке ]
refixs Дата 22.3.2010, 3:04
  Да, я понял свою ошибку. Я не сделал привязку фильтра через installEventFilter. Отпишусь как вернусь к задаче. Пока меня устраивает решение описанное выше.
Litkevich Yuriy Дата 21.3.2010, 12:26
 
Цитата(refixs @ 21.3.2010, 15:02) *
Да, а MainWindow это основное. Фильтр я пробовал и туда и туда ставить.
отсюда вывод - ты не понимаешь, что такое "фильтр событий", К стати говоря я так и не увидел кода, который устанавливает фильтр событий.
Ты должен в MainWindow установить фильтр событий на интересующий тебя экземпляр класса NotifyWindow
Читай асистент bool QObject::eventFilter ( QObject * watched, QEvent * event ) [virtual]
там очень простой и понятный пример
refixs Дата 21.3.2010, 12:02
 
Цитата(Litkevich Yuriy @ 21.3.2010, 3:38) *
NotifyWindow - это всплывающее окно?

Да, а MainWindow это основное. Фильтр я пробовал и туда и туда ставить.

Цитата(Litkevich Yuriy @ 21.3.2010, 3:38) *
не знаю ничего про отладчик, у меня один отладчик:
qDebug() << "Название функции"

bool NotifyWindow::eventFilter(QObject *obj, QEvent *event) {
    qDebug() << "NotifyWindow::eventFilter";
    return QWidget::eventFilter(obj, event);
}
bool MainWindow::eventFilter(QObject *obj, QEvent *event) {
    qDebug() << "MainWindow::eventFilter";
    return QMainWindow::eventFilter(obj, event);
}


Вывод приложения:
Lowest section in C:\WINDOWS\system32\xpsp2res.dll is .rsrc at 00011000

Добавил еще в конструкторы на всякий случай (чтоб проверить или qDebug() вообще срабатывает), получил такой вот вывод:
Цитата
MainWindow::MainWindow
Lowest section in C:\WINDOWS\system32\xpsp2res.dll is .rsrc at 00011000
NotifyWindow::NotifyWindow
NotifyWindow::NotifyWindow
Litkevich Yuriy Дата 21.3.2010, 3:38
  NotifyWindow - это всплывающее окно?


Цитата(refixs @ 21.3.2010, 6:20) *
но какая разница какой код если отладчик не останавливается в начале функции?
не знаю ничего про отладчик, у меня один отладчик:
qDebug() << "Название функции"
refixs Дата 21.3.2010, 3:20
  Там два сообщения, отдельно добавить не получилось. В первом я сказал, что eventFilter не срабатывает, отладчик не останавливается в начале функции. Во втором сообщении я рассказал о том как решил решить свою проблему.

Вот один из вариантов использования eventFilter:
bool NotifyWindow::eventFilter(QObject *obj, QEvent *event) {
    if(event->type() == QEvent::MouseButtonPress) {
        return true;
    } else {
        QWidget::eventFilter(obj, event);
    }
}


но какая разница какой код если отладчик не останавливается в начале функции?
Litkevich Yuriy Дата 21.3.2010, 2:49
 
Цитата(refixs @ 21.3.2010, 5:19) *
Что-то у меня до eventFilter вообще ничего не доходит
и тот код, что ты привел, как бы не согласуются.
Ты понимаешь что есть такие вещи как Фильтры событий?
(eventFilter, installEventFilter)
refixs Дата 21.3.2010, 2:30
  Точка остановки стоит в самом начале метода. Запускаю в режиме отладки (в QtCreator) и не останавливается ни при каких обстоятельствах.

Наверно все таки вся загвоздка в этом activateWindow, если без него то окна нормально исчезают.

void NotifyWindow::mousePressEvent(QMouseEvent *event) {
    event->accept();
    hide();
    if(event->button() == Qt::LeftButton) {
        MainWindow::get()->activateWindow();
    }
}


Если убрать "мигание" на панели задач, то вот так работает. А мигание я наверно сделаю при условии что всплывающие окна скрыты.
Litkevich Yuriy Дата 21.3.2010, 2:20
 
Цитата(refixs @ 21.3.2010, 5:12) *
Что-то у меня до eventFilter
покажи как настраиваешь перехват событий
refixs Дата 21.3.2010, 2:19
  Что-то у меня до eventFilter вообще ничего не доходит не в основном окне не в NotifyWindow.

ЗЫ. С 6000ым сообщением ;)

Еще такой момент, всплывающее сообщение подкрепляется периодическими вызовами activateWindow у основного окна. activateWindow вызывается раз в 1 секунду заставляя основное окошко мигать оранжевым на панели задач. В итоге получается как-то так:
- Появляется всплывающее окно
- Щелкаем по нему, оно получает фокус ввода
- Срабатывает activateWindow, фокус ввода получает MainWindow
Litkevich Yuriy Дата 21.3.2010, 0:14
  refixs,
Цитата(refixs @ 21.3.2010, 1:47) *
а правым убирать всплывающее не изменяя текущего активного окна.
можно в основном окне поставить фильтр событий на всплывающее. Если в обработчике фильтра событие не игнорировать, т.е. функция
bool MyWindow::eventFilter ( QObject * watched, QEvent * event ) [virtual]
вернёт true то, событие не дойдёт до всплывающего окна, следовательно оно не получит фокус ввода (я так думаю).
Просмотр темы полностью (откроется в новом окне)
RSS Рейтинг@Mail.ru Текстовая версия Сейчас: 10.7.2025, 1:33