![]() |
Здравствуйте, гость ( Вход | Регистрация )
![]() |
breeve |
![]()
Сообщение
#1
|
Участник ![]() ![]() Группа: Участник Сообщений: 188 Регистрация: 26.12.2009 Пользователь №: 1336 Спасибо сказали: 9 раз(а) Репутация: ![]() ![]() ![]() |
Пытаюсь сделать всплывающее окно как в exail'е справа в углу:
![]() Оно появляется на секунд 10 и исчезает. Если наводишь на него то оно становится прозрачным. Если кликаешь по нему, то кликается на окошко позади этого. Т.е. оно на вид прозрачное и по сути тоже является таковым.. Как такое сделать? Пытался сделать класс Всплывающее окошко. наследовал от виджета либо от диалога, с флагом popup. Хотел сделать его с закругленными углами, а оказалось что через style sheet нельзя редактировать внешний вид Qwidget или Qdialog'а. Только если background. Потом пытался сделать через label. Но там тоже засада... Окошко появляется захватывает фокус и все..)) Я ничего не могу сделать. Куда мышкой не нажимаю ничего не происходит.. Ни клава не работает.. Может можно как-то попроще это все сделать? Кто что посоветует? Сообщение отредактировал breeve - 28.2.2010, 15:06 |
|
|
![]() |
Litkevich Yuriy |
![]()
Сообщение
#2
|
![]() разработчик РЭА ![]() ![]() ![]() ![]() ![]() ![]() ![]() Группа: Сомодератор Сообщений: 9669 Регистрация: 9.1.2008 Из: Тюмень Пользователь №: 64 Спасибо сказали: 807 раз(а) Репутация: ![]() ![]() ![]() |
offtop: breeve, скажи полное название версии ОСьки на скрине, пожалуйста.
|
|
|
breeve |
![]()
Сообщение
#3
|
Участник ![]() ![]() Группа: Участник Сообщений: 188 Регистрация: 26.12.2009 Пользователь №: 1336 Спасибо сказали: 9 раз(а) Репутация: ![]() ![]() ![]() |
Ubuntu 9.10 - Karmic Koala..
Сообщение отредактировал breeve - 28.2.2010, 15:19 |
|
|
Litkevich Yuriy |
![]()
Сообщение
#4
|
![]() разработчик РЭА ![]() ![]() ![]() ![]() ![]() ![]() ![]() Группа: Сомодератор Сообщений: 9669 Регистрация: 9.1.2008 Из: Тюмень Пользователь №: 64 Спасибо сказали: 807 раз(а) Репутация: ![]() ![]() ![]() |
Т.е. оно на вид прозрачное и по сути тоже является таковым.. См. Окно «прозрачное» для мыши
|
|
|
Rocky |
![]()
Сообщение
#5
|
Старейший участник ![]() ![]() ![]() ![]() Группа: Участник Сообщений: 530 Регистрация: 22.12.2008 Из: Санкт-Петербург Пользователь №: 463 Спасибо сказали: 22 раз(а) Репутация: ![]() ![]() ![]() |
|
|
|
DEADHUNT |
![]()
Сообщение
#6
|
Активный участник ![]() ![]() ![]() Группа: Участник Сообщений: 430 Регистрация: 15.4.2009 Пользователь №: 686 Спасибо сказали: 26 раз(а) Репутация: ![]() ![]() ![]() |
|
|
|
SABROG |
![]()
Сообщение
#7
|
![]() Профессионал ![]() ![]() ![]() ![]() ![]() Группа: Участник Сообщений: 1207 Регистрация: 8.12.2008 Из: Russia, Moscow Пользователь №: 446 Спасибо сказали: 229 раз(а) Репутация: ![]() ![]() ![]() |
Как-то слишком просто. Может это решение только для отношения QWidget->QWidget, а окошки операционной системы оно не затрагивает? Просто когда сам искал нашел лишь 2 решения: - делать дырку через setMask под курсором мыши размером 1x1 - рисовать на контекст рабочего стола напрямую средствами ОС Первый вариант плох тем, что нижнему окну постоянно приходят события Hover, LeaveHover и оно себя забавно ведет при таком раскладе, если пытается какой нибудь виджет подсвечивать. А второй вариант плох тем, что изображение быстро затирается при обновлении рабочего стола, поэтому нужно постоянно перерисовывать. И вроде как это приводит к морганию картинки (flickering). --- Всё, я понял, не внимательно прочитал первый пост SASA. У него 2 Qt'шных виджета. Тут ничего общего с окнами, которые пытаются делать люди на WINAPI. Сообщение отредактировал SABROG - 28.2.2010, 22:06 |
|
|
breeve |
![]()
Сообщение
#8
|
Участник ![]() ![]() Группа: Участник Сообщений: 188 Регистрация: 26.12.2009 Пользователь №: 1336 Спасибо сказали: 9 раз(а) Репутация: ![]() ![]() ![]() |
У меня вот такой вопрос сделал так чтобы когда наводишь на него становиться прозрачным..
Делал так, конструктор: Далее moveMouseEvent: А как сделать чтобы если мышь не находиться на виджете то сделать обратно полноцветный? Единственная догадка это считать положение мыши если не входит в QRect(размер виджета), то делать нормальным. |
|
|
Rocky |
![]()
Сообщение
#9
|
Старейший участник ![]() ![]() ![]() ![]() Группа: Участник Сообщений: 530 Регистрация: 22.12.2008 Из: Санкт-Петербург Пользователь №: 463 Спасибо сказали: 22 раз(а) Репутация: ![]() ![]() ![]() |
enterEvent
leaveEvent ? |
|
|
breeve |
![]()
Сообщение
#10
|
Участник ![]() ![]() Группа: Участник Сообщений: 188 Регистрация: 26.12.2009 Пользователь №: 1336 Спасибо сказали: 9 раз(а) Репутация: ![]() ![]() ![]() |
enterEvent leaveEvent ? Спасибо.. Сделал вот так: Еще вопрос. Задумывается приложение которое всегда сидит в трее. у него не должно быть основного окна. А у меня появляется пустое окно. Пытаюсь его скрыть а оно все равно не пропадает. Не могу понять как это сделать.. |
|
|
SABROG |
![]()
Сообщение
#11
|
![]() Профессионал ![]() ![]() ![]() ![]() ![]() Группа: Участник Сообщений: 1207 Регистрация: 8.12.2008 Из: Russia, Moscow Пользователь №: 446 Спасибо сказали: 229 раз(а) Репутация: ![]() ![]() ![]() |
|
|
|
breeve |
![]()
Сообщение
#12
|
Участник ![]() ![]() Группа: Участник Сообщений: 188 Регистрация: 26.12.2009 Пользователь №: 1336 Спасибо сказали: 9 раз(а) Репутация: ![]() ![]() ![]() |
Выражайтесь яснее. Речь ведь идет о панели задач, где появляется лишний пустой прямоугольник. Запускаю приложение. Появляется здоровое пустое окно, как если бы запустить пустой проект.. Вот мой конструктор:
Ну и помимо этого появляется иконка в трее все как положено.. Сообщение отредактировал breeve - 28.2.2010, 22:49 |
|
|
SABROG |
![]()
Сообщение
#13
|
![]() Профессионал ![]() ![]() ![]() ![]() ![]() Группа: Участник Сообщений: 1207 Регистрация: 8.12.2008 Из: Russia, Moscow Пользователь №: 446 Спасибо сказали: 229 раз(а) Репутация: ![]() ![]() ![]() |
Не вызывай show() в main.cpp. Твой hide() выполняется в конструкторе, еще до того как ты вызовешь show() или a.exec().
Сообщение отредактировал SABROG - 28.2.2010, 22:54 |
|
|
breeve |
![]()
Сообщение
#14
|
Участник ![]() ![]() Группа: Участник Сообщений: 188 Регистрация: 26.12.2009 Пользователь №: 1336 Спасибо сказали: 9 раз(а) Репутация: ![]() ![]() ![]() |
Вопрос. Вот есть у меня QMenu в котором QAction - show(). Нажимаешь на show появляется не модальное диалоговое окно. Нажимаешь повторно и появляется такое же в точности поверху, и т.д. Как сделать так чтобы ограничить кол-во, чтобы как открылось первое окошко второе открыться не могло?
|
|
|
Litkevich Yuriy |
![]()
Сообщение
#15
|
![]() разработчик РЭА ![]() ![]() ![]() ![]() ![]() ![]() ![]() Группа: Сомодератор Сообщений: 9669 Регистрация: 9.1.2008 Из: Тюмень Пользователь №: 64 Спасибо сказали: 807 раз(а) Репутация: ![]() ![]() ![]() |
|
|
|
breeve |
![]()
Сообщение
#16
|
Участник ![]() ![]() Группа: Участник Сообщений: 188 Регистрация: 26.12.2009 Пользователь №: 1336 Спасибо сказали: 9 раз(а) Репутация: ![]() ![]() ![]() |
|
|
|
Litkevich Yuriy |
![]()
Сообщение
#17
|
![]() разработчик РЭА ![]() ![]() ![]() ![]() ![]() ![]() ![]() Группа: Сомодератор Сообщений: 9669 Регистрация: 9.1.2008 Из: Тюмень Пользователь №: 64 Спасибо сказали: 807 раз(а) Репутация: ![]() ![]() ![]() |
А что за шлажок? в вести булевую переменную, и в слоте, где обрабатывается действие, проверять её, если ИСТИНА, то найти диалог и вывести его на первый план, если ЛОЖНО, то создать и показать.На закрытие окна (acept/reject) предусмотреть слот, который будет сбрасывать флажок |
|
|
BRE |
![]()
Сообщение
#18
|
![]() Профессионал ![]() ![]() ![]() ![]() ![]() Группа: Участник Сообщений: 1112 Регистрация: 6.3.2009 Из: Ростов-на-Дону Пользователь №: 591 Спасибо сказали: 264 раз(а) Репутация: ![]() ![]() ![]() |
проверять её, если ИСТИНА, то найти диалог и вывести его на первый план, если ЛОЖНО, то создать и показать. Наверное лучше сразу искать и выводить, а если не нашли - значит диалога нет и нужно его создать. Тогда и флажки не понадобятся... На закрытие окна (acept/reject) предусмотреть слот, который будет сбрасывать флажок |
|
|
breeve |
![]()
Сообщение
#19
|
Участник ![]() ![]() Группа: Участник Сообщений: 188 Регистрация: 26.12.2009 Пользователь №: 1336 Спасибо сказали: 9 раз(а) Репутация: ![]() ![]() ![]() |
Наверное лучше сразу искать и выводить, а если не нашли - значит диалога нет и нужно его создать. Про флажки это достаточно просто и неинтересно я тоже над этим думал.. А вот насчет найти диалог.. Как это? Глупый вопрос конечно.. оффтоп = "тут надо создать раздел для новичков. Что-то вроде вы новичок - вам сюда.. Как раз для меня))" Сообщение отредактировал breeve - 1.3.2010, 21:23 |
|
|
BRE |
![]()
Сообщение
#20
|
![]() Профессионал ![]() ![]() ![]() ![]() ![]() Группа: Участник Сообщений: 1112 Регистрация: 6.3.2009 Из: Ростов-на-Дону Пользователь №: 591 Спасибо сказали: 264 раз(а) Репутация: ![]() ![]() ![]() |
А вот насчет найти диалог.. Как это? Глупый вопрос конечно.. А диалог это обычный виджет. Если у него установлен parent, то можно воспользоваться функцией: QList<T> QObject::findChildren ( const QString & name = QString() ) const Если это диалоги верхнего уровня, то: QWidgetList QApplication::topLevelWidgets () [static] |
|
|
Litkevich Yuriy |
![]()
Сообщение
#21
|
![]() разработчик РЭА ![]() ![]() ![]() ![]() ![]() ![]() ![]() Группа: Сомодератор Сообщений: 9669 Регистрация: 9.1.2008 Из: Тюмень Пользователь №: 64 Спасибо сказали: 807 раз(а) Репутация: ![]() ![]() ![]() |
|
|
|
SABROG |
![]()
Сообщение
#22
|
![]() Профессионал ![]() ![]() ![]() ![]() ![]() Группа: Участник Сообщений: 1207 Регистрация: 8.12.2008 Из: Russia, Moscow Пользователь №: 446 Спасибо сказали: 229 раз(а) Репутация: ![]() ![]() ![]() |
Проблема может только появится, если диалогов может быть несколько и они скрыты например. Зато если задать уникальное имя объекту, то промахов быть не должно:
Но я не пойму как мы вообще до такого докатились? Диалоги сам по себе редко когда создаются, а это значит, что в большинстве случаев у нас есть указатель на него, который можно поместить в private секцию класса. А проверка делается легко QWidget::isVisible(). |
|
|
BRE |
![]()
Сообщение
#23
|
![]() Профессионал ![]() ![]() ![]() ![]() ![]() Группа: Участник Сообщений: 1112 Регистрация: 6.3.2009 Из: Ростов-на-Дону Пользователь №: 591 Спасибо сказали: 264 раз(а) Репутация: ![]() ![]() ![]() |
можно сократить расходы на поиск: 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 |
![]()
Сообщение
#24
|
![]() разработчик РЭА ![]() ![]() ![]() ![]() ![]() ![]() ![]() Группа: Сомодератор Сообщений: 9669 Регистрация: 9.1.2008 Из: Тюмень Пользователь №: 64 Спасибо сказали: 807 раз(а) Репутация: ![]() ![]() ![]() |
|
|
|
refixs |
![]()
Сообщение
#25
|
Студент ![]() Группа: Новичок Сообщений: 16 Регистрация: 17.11.2009 Пользователь №: 1238 Спасибо сказали: 0 раз(а) Репутация: ![]() ![]() ![]() |
Доброго времени суток.
Есть всплывающие окно, нужно его закрыть по правому клику мыши, при этом не активируя приложения. Сделал так:
Идея в том чтоб левым щелчком активировать основное окно, а правым убирать всплывающее не изменяя текущего активного окна. Пробовал с event->ignore(); пробовал играться с атрибутами WA_NoMousePropagation и WA_NoMouseReplay. Что-то ничего не получается. Как не пробовал после щелчка мышью на всплывающем окне активным становится всплывающее, а когда оно закрывается активируется основное окно приложения. |
|
|
Litkevich Yuriy |
![]()
Сообщение
#26
|
![]() разработчик РЭА ![]() ![]() ![]() ![]() ![]() ![]() ![]() Группа: Сомодератор Сообщений: 9669 Регистрация: 9.1.2008 Из: Тюмень Пользователь №: 64 Спасибо сказали: 807 раз(а) Репутация: ![]() ![]() ![]() |
refixs,
а правым убирать всплывающее не изменяя текущего активного окна. можно в основном окне поставить фильтр событий на всплывающее. Если в обработчике фильтра событие не игнорировать, т.е. функцияbool MyWindow::eventFilter ( QObject * watched, QEvent * event ) [virtual] вернёт true то, событие не дойдёт до всплывающего окна, следовательно оно не получит фокус ввода (я так думаю). |
|
|
refixs |
![]()
Сообщение
#27
|
Студент ![]() Группа: Новичок Сообщений: 16 Регистрация: 17.11.2009 Пользователь №: 1238 Спасибо сказали: 0 раз(а) Репутация: ![]() ![]() ![]() |
Что-то у меня до eventFilter вообще ничего не доходит не в основном окне не в NotifyWindow.
ЗЫ. С 6000ым сообщением ![]() Еще такой момент, всплывающее сообщение подкрепляется периодическими вызовами activateWindow у основного окна. activateWindow вызывается раз в 1 секунду заставляя основное окошко мигать оранжевым на панели задач. В итоге получается как-то так: - Появляется всплывающее окно - Щелкаем по нему, оно получает фокус ввода - Срабатывает activateWindow, фокус ввода получает MainWindow |
|
|
Litkevich Yuriy |
![]()
Сообщение
#28
|
![]() разработчик РЭА ![]() ![]() ![]() ![]() ![]() ![]() ![]() Группа: Сомодератор Сообщений: 9669 Регистрация: 9.1.2008 Из: Тюмень Пользователь №: 64 Спасибо сказали: 807 раз(а) Репутация: ![]() ![]() ![]() |
|
|
|
refixs |
![]()
Сообщение
#29
|
Студент ![]() Группа: Новичок Сообщений: 16 Регистрация: 17.11.2009 Пользователь №: 1238 Спасибо сказали: 0 раз(а) Репутация: ![]() ![]() ![]() |
Точка остановки стоит в самом начале метода. Запускаю в режиме отладки (в QtCreator) и не останавливается ни при каких обстоятельствах.
Наверно все таки вся загвоздка в этом activateWindow, если без него то окна нормально исчезают.
Если убрать "мигание" на панели задач, то вот так работает. А мигание я наверно сделаю при условии что всплывающие окна скрыты. |
|
|
Litkevich Yuriy |
![]()
Сообщение
#30
|
![]() разработчик РЭА ![]() ![]() ![]() ![]() ![]() ![]() ![]() Группа: Сомодератор Сообщений: 9669 Регистрация: 9.1.2008 Из: Тюмень Пользователь №: 64 Спасибо сказали: 807 раз(а) Репутация: ![]() ![]() ![]() |
|
|
|
refixs |
![]()
Сообщение
#31
|
Студент ![]() Группа: Новичок Сообщений: 16 Регистрация: 17.11.2009 Пользователь №: 1238 Спасибо сказали: 0 раз(а) Репутация: ![]() ![]() ![]() |
Там два сообщения, отдельно добавить не получилось. В первом я сказал, что eventFilter не срабатывает, отладчик не останавливается в начале функции. Во втором сообщении я рассказал о том как решил решить свою проблему.
Вот один из вариантов использования eventFilter:
но какая разница какой код если отладчик не останавливается в начале функции? |
|
|
Litkevich Yuriy |
![]()
Сообщение
#32
|
![]() разработчик РЭА ![]() ![]() ![]() ![]() ![]() ![]() ![]() Группа: Сомодератор Сообщений: 9669 Регистрация: 9.1.2008 Из: Тюмень Пользователь №: 64 Спасибо сказали: 807 раз(а) Репутация: ![]() ![]() ![]() |
|
|
|
refixs |
![]()
Сообщение
#33
|
Студент ![]() Группа: Новичок Сообщений: 16 Регистрация: 17.11.2009 Пользователь №: 1238 Спасибо сказали: 0 раз(а) Репутация: ![]() ![]() ![]() |
NotifyWindow - это всплывающее окно? Да, а MainWindow это основное. Фильтр я пробовал и туда и туда ставить. не знаю ничего про отладчик, у меня один отладчик: qDebug() << "Название функции"
Вывод приложения: 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 |
![]()
Сообщение
#34
|
![]() разработчик РЭА ![]() ![]() ![]() ![]() ![]() ![]() ![]() Группа: Сомодератор Сообщений: 9669 Регистрация: 9.1.2008 Из: Тюмень Пользователь №: 64 Спасибо сказали: 807 раз(а) Репутация: ![]() ![]() ![]() |
Да, а MainWindow это основное. Фильтр я пробовал и туда и туда ставить. отсюда вывод - ты не понимаешь, что такое "фильтр событий", К стати говоря я так и не увидел кода, который устанавливает фильтр событий. Ты должен в MainWindow установить фильтр событий на интересующий тебя экземпляр класса NotifyWindow Читай асистент bool QObject::eventFilter ( QObject * watched, QEvent * event ) [virtual] там очень простой и понятный пример |
|
|
refixs |
![]()
Сообщение
#35
|
Студент ![]() Группа: Новичок Сообщений: 16 Регистрация: 17.11.2009 Пользователь №: 1238 Спасибо сказали: 0 раз(а) Репутация: ![]() ![]() ![]() |
Да, я понял свою ошибку. Я не сделал привязку фильтра через installEventFilter. Отпишусь как вернусь к задаче. Пока меня устраивает решение описанное выше.
|
|
|
![]() ![]() ![]() |
![]() |
|
Текстовая версия | Сейчас: 27.6.2025, 5:26 |