crossplatform.ru

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


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

Введите в поле код из 6 символов, отображенных в виде изображения. Если вы не можете прочитать код с изображения, нажмите на изображение для генерации нового кода.
 

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


Последние 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 Текстовая версия Сейчас: 11.12.2024, 13:48