crossplatform.ru

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

4 страниц V  < 1 2 3 4 >  
Ответить в данную темуНачать новую тему
> Всплывающие окна
Litkevich Yuriy
  опции профиля:
сообщение 1.3.2010, 22:34
Сообщение #21


разработчик РЭА
*******

Группа: Сомодератор
Сообщений: 9669
Регистрация: 9.1.2008
Из: Тюмень
Пользователь №: 64

Спасибо сказали: 807 раз(а)




Репутация:   94  


Цитата(BRE @ 2.3.2010, 1:08) *
QList<T> QObject::findChildren ( const QString & name = QString() ) const
можно сократить расходы на поиск:
QList<QDialog *> dialogs = this->findChildren<QDialog *>();
Т.е. искать сразу нужный класс. Получается быстрее
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
SABROG
  опции профиля:
сообщение 1.3.2010, 23:34
Сообщение #22


Профессионал
*****

Группа: Участник
Сообщений: 1207
Регистрация: 8.12.2008
Из: Russia, Moscow
Пользователь №: 446

Спасибо сказали: 229 раз(а)




Репутация:   34  


Проблема может только появится, если диалогов может быть несколько и они скрыты например. Зато если задать уникальное имя объекту, то промахов быть не должно:

T QObject::findChild ( const QString & name = QString() ) const


Но я не пойму как мы вообще до такого докатились? Диалоги сам по себе редко когда создаются, а это значит, что в большинстве случаев у нас есть указатель на него, который можно поместить в private секцию класса. А проверка делается легко QWidget::isVisible().
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
BRE
  опции профиля:
сообщение 1.3.2010, 23:34
Сообщение #23


Профессионал
*****

Группа: Участник
Сообщений: 1112
Регистрация: 6.3.2009
Из: Ростов-на-Дону
Пользователь №: 591

Спасибо сказали: 264 раз(а)




Репутация:   44  


Цитата(Litkevich Yuriy @ 1.3.2010, 22:34) *
можно сократить расходы на поиск:
QList<QDialog *> dialogs = this->findChildren<QDialog *>();
Т.е. искать сразу нужный класс. Получается быстрее

Ну так я про это же. :)
Указание имени так же повысит скорость:
QList<QDialog *> dialogs = this->findChildren<QDialog *>( "NameDialog" );
QList<MainDialog *> dialogs = this->findChildren<MainDialog *>();
QList<MainDialog *> dialogs = this->findChildren<MainDialog *>( "MainDialog" );


Сообщение отредактировал BRE - 1.3.2010, 23:38
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Litkevich Yuriy
  опции профиля:
сообщение 2.3.2010, 0:21
Сообщение #24


разработчик РЭА
*******

Группа: Сомодератор
Сообщений: 9669
Регистрация: 9.1.2008
Из: Тюмень
Пользователь №: 64

Спасибо сказали: 807 раз(а)




Репутация:   94  


Цитата(SABROG @ 2.3.2010, 2:34) *
Но я не пойму как мы вообще до такого докатились?
:)
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
refixs
  опции профиля:
сообщение 20.3.2010, 22:47
Сообщение #25


Студент
*

Группа: Новичок
Сообщений: 16
Регистрация: 17.11.2009
Пользователь №: 1238

Спасибо сказали: 0 раз(а)




Репутация:   0  


Доброго времени суток.
Есть всплывающие окно, нужно его закрыть по правому клику мыши, при этом не активируя приложения.

Сделал так:
void NotifyWindow::mousePressEvent(QMouseEvent  *event) {
    if(event->button() == Qt::RightButton) {
        event->ignore(); // тут пробовал по всякому
        showTimer.stop();
        hide();
    } else if(event->button() == Qt::LeftButton) {
        event->accept();
        showTimer.stop();
        hide();
    }
}


Идея в том чтоб левым щелчком активировать основное окно, а правым убирать всплывающее не изменяя текущего активного окна. Пробовал с event->ignore(); пробовал играться с атрибутами WA_NoMousePropagation и WA_NoMouseReplay. Что-то ничего не получается.

Как не пробовал после щелчка мышью на всплывающем окне активным становится всплывающее, а когда оно закрывается активируется основное окно приложения.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Litkevich Yuriy
  опции профиля:
сообщение 21.3.2010, 0:14
Сообщение #26


разработчик РЭА
*******

Группа: Сомодератор
Сообщений: 9669
Регистрация: 9.1.2008
Из: Тюмень
Пользователь №: 64

Спасибо сказали: 807 раз(а)




Репутация:   94  


refixs,
Цитата(refixs @ 21.3.2010, 1:47) *
а правым убирать всплывающее не изменяя текущего активного окна.
можно в основном окне поставить фильтр событий на всплывающее. Если в обработчике фильтра событие не игнорировать, т.е. функция
bool MyWindow::eventFilter ( QObject * watched, QEvent * event ) [virtual]
вернёт true то, событие не дойдёт до всплывающего окна, следовательно оно не получит фокус ввода (я так думаю).
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
refixs
  опции профиля:
сообщение 21.3.2010, 2:19
Сообщение #27


Студент
*

Группа: Новичок
Сообщений: 16
Регистрация: 17.11.2009
Пользователь №: 1238

Спасибо сказали: 0 раз(а)




Репутация:   0  


Что-то у меня до eventFilter вообще ничего не доходит не в основном окне не в NotifyWindow.

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

Еще такой момент, всплывающее сообщение подкрепляется периодическими вызовами activateWindow у основного окна. activateWindow вызывается раз в 1 секунду заставляя основное окошко мигать оранжевым на панели задач. В итоге получается как-то так:
- Появляется всплывающее окно
- Щелкаем по нему, оно получает фокус ввода
- Срабатывает activateWindow, фокус ввода получает MainWindow
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Litkevich Yuriy
  опции профиля:
сообщение 21.3.2010, 2:20
Сообщение #28


разработчик РЭА
*******

Группа: Сомодератор
Сообщений: 9669
Регистрация: 9.1.2008
Из: Тюмень
Пользователь №: 64

Спасибо сказали: 807 раз(а)




Репутация:   94  


Цитата(refixs @ 21.3.2010, 5:12) *
Что-то у меня до eventFilter
покажи как настраиваешь перехват событий
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
refixs
  опции профиля:
сообщение 21.3.2010, 2:30
Сообщение #29


Студент
*

Группа: Новичок
Сообщений: 16
Регистрация: 17.11.2009
Пользователь №: 1238

Спасибо сказали: 0 раз(а)




Репутация:   0  


Точка остановки стоит в самом начале метода. Запускаю в режиме отладки (в QtCreator) и не останавливается ни при каких обстоятельствах.

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

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


Если убрать "мигание" на панели задач, то вот так работает. А мигание я наверно сделаю при условии что всплывающие окна скрыты.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Litkevich Yuriy
  опции профиля:
сообщение 21.3.2010, 2:49
Сообщение #30


разработчик РЭА
*******

Группа: Сомодератор
Сообщений: 9669
Регистрация: 9.1.2008
Из: Тюмень
Пользователь №: 64

Спасибо сказали: 807 раз(а)




Репутация:   94  


Цитата(refixs @ 21.3.2010, 5:19) *
Что-то у меня до eventFilter вообще ничего не доходит
и тот код, что ты привел, как бы не согласуются.
Ты понимаешь что есть такие вещи как Фильтры событий?
(eventFilter, installEventFilter)
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

4 страниц V  < 1 2 3 4 >
Быстрый ответОтветить в данную темуНачать новую тему
Теги
Нет тегов для показа


1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0




RSS Текстовая версия Сейчас: 30.11.2024, 11:53