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

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

Страниц: [1] 2   Вниз
  Печать  
Автор Тема: Накрываем виджеты стеклом. Эффект блокировки виджета.  (Прочитано 24214 раз)
Bepec
Гость
« : Май 22, 2013, 10:33 »

Краткая предыстория:
Часто при разработке приложений сильно зависящих от ресурсов (серверов, устройств, файлов и т. п.), возникает необходимость сообщить пользователю об их недоступности. А иногда и полностью заблокировать работу с приложением до освобождения или начала работы ресурса. Такая необходимость возникает при создании различных тонких клиентов.

Что сподвигло:
Статей на эту темы много. А готовых продуктов я, когда было необходимо, не нашёл. Заодно подправлю оформление кода, если будут критики.

Что получилось:
Взяв за основу статью VaiMR (ссылка в конце сообщения) и собственную мотивацию я сделал завершённый класс.
Возможно он имеется у каждого программиста в том или ином виду.

Здесь же я привожу готовый к употреблению продукт с исходниками и тестовой программой.

Так же материал будет полезен для новичков из-за простоты кода и русских комментариев.

Данный класс написан под Qt 4.7.2 работоспособен  с версии Qt 4.7.2 и до Qt 5.9.2. В архиве имеется файл проекта VS2008 плюс стандартный pro файл. Исходники переведены в UTF-8.
Отзывы пожелания комментарии оставляйте, буду рад.

Ссылка на статью VaiMR - http://www.quizful.net/post/glass-qt-component (более подробное описание слотов и пошаговое пояснение).

Архив запаролен. Пароль: "prog.org.ru" без кавычек.

update: исправлен баг - не блокировались event's на виджете жертве.

update 2: внесены правки и проверена работа под minGW, MSVC. Внесены отредактированные правки gil9red. Перезалито.
« Последнее редактирование: Март 10, 2018, 15:32 от Bepec » Записан
GreatSnake
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2921



Просмотр профиля
« Ответ #1 : Май 22, 2013, 11:16 »

А теперь добавь аккселератор на какой нибудь контрол, например, на кнопку, и увидишь как "разобъётся" твое "стекло")
Решение не самое простое, подсказывать пока не буду)
Записан

Qt 5.11/4.8.7 (X11/Win)
Bepec
Гость
« Ответ #2 : Май 22, 2013, 11:59 »

Акселератор имеется в виду сочетание клавиш? Расшифруйте пожалуйста )
Записан
GreatSnake
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2921



Просмотр профиля
« Ответ #3 : Май 22, 2013, 12:02 »

Акселератор имеется в виду сочетание клавиш? Расшифруйте пожалуйста )
Hot-key, QShortcut
Записан

Qt 5.11/4.8.7 (X11/Win)
Bepec
Гость
« Ответ #4 : Май 22, 2013, 12:49 »

Решение довольно простое - я не блокировал события в eventFilter. Что и послужило причиной пробега событий Веселый Перезаливаю архив.
Записан
gil9red
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 1805



Просмотр профиля WWW
« Ответ #5 : Август 16, 2013, 19:57 »

Компилятор gсс 4.6.2
Ошибка: taking address of temporary [-fpermissive]

Строка 160: wGlass_->setGraphicsEffect(&QGraphicsOpacityEffect());
Жалуется на &QGraphicsOpacityEffect()
Лечится
Код:
QGraphicsOpacityEffect off;
wGlass_->setGraphicsEffect(&off);

Строка 223: wAnimationContainer_->setMovie(&QMovie());
Такая же жалоба Улыбающийся
Лечение:
Код:
QMovie off;
wAnimationContainer_->setMovie(&off);
« Последнее редактирование: Август 16, 2013, 22:29 от gil9red » Записан

Bepec
Гость
« Ответ #6 : Август 16, 2013, 20:04 »

Версию Qt приведи пожалуйста Улыбающийся

PS ты надеюсь понимаешь, что подобной правкой ты создаёшь утечку памяти в двух местах?

PPS удивлён что ругается. Видимо всё таки версия Qt другая. Уточни.


PPPS Может это варнинг, а не еррор? Компилятор прав, объект уничтожится в конце функции, но это не смертельно как бы.

update: Это особенность gcc. Вместо варнинга или молчания, как другие компиляторы, он ставит еррор.

Лечение - припиши флаг -fpermissive компилятору.

 
« Последнее редактирование: Август 16, 2013, 20:16 от Bepec » Записан
kambala
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4747



Просмотр профиля WWW
« Ответ #7 : Август 16, 2013, 20:38 »

слотам в SBControl неплохо бы дать вменяемые названия
Записан

Изучением C++ вымощена дорога в Qt.

UTF-8 has been around since 1993 and Unicode 2.0 since 1996; if you have created any 8-bit character content since 1996 in anything other than UTF-8, then I hate you. © Matt Gallagher
Bepec
Гость
« Ответ #8 : Август 16, 2013, 20:42 »

Кхм, учту. Делалось в виде примера. для использования - тут важен сам glass.

Ещё замечания есть?
Записан
gil9red
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 1805



Просмотр профиля WWW
« Ответ #9 : Август 16, 2013, 22:28 »

PS ты надеюсь понимаешь, что подобной правкой ты создаёшь утечку памяти в двух местах?
Лечение - припиши флаг -fpermissive компилятору.  

Первое, что пришло в голову Смеющийся
Хотелось просто увидеть, как работает )

А так заменил бы на:
Код:
QGraphicsOpacityEffect off;
wGlass_->setGraphicsEffect(&off);
и
Код:
QMovie off;
wAnimationContainer_->setMovie(&off);

Исправил предыдущее свое сообщение Улыбающийся
« Последнее редактирование: Август 16, 2013, 22:30 от gil9red » Записан

gil9red
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 1805



Просмотр профиля WWW
« Ответ #10 : Август 16, 2013, 22:32 »

Ещё замечания есть?

Желательно бы сам пример отделить от файлов glass Улыбающийся
sbclass и sbcontrol очень похожие, и пока в коде не полазил, думал что sbcontrol обязателен для работы glass )
« Последнее редактирование: Август 16, 2013, 22:34 от gil9red » Записан

Bepec
Гость
« Ответ #11 : Август 16, 2013, 22:34 »

Понятно. Комбинированные операторы gcc не жрёт. Поправлю ради пущей совместимости.

А про отделение - посмотрю.
Записан
gil9red
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 1805



Просмотр профиля WWW
« Ответ #12 : Август 16, 2013, 22:50 »

Вот еще Улыбающийся
Поместил я glass на QTableView, но скроллы не были закрыты, так должно быть? )

Код:
    glass = new SBGlass(ui->tableView);
    glass->install(ui->tableView);
    glass->enableOpacity();
    glass->enableColor();
« Последнее редактирование: Август 16, 2013, 23:07 от gil9red » Записан

gil9red
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 1805



Просмотр профиля WWW
« Ответ #13 : Август 16, 2013, 22:53 »

Еще кое что нашел, связанно с изменением размера виджета, накрытого стеклом Улыбающийся
Сплиттером подвигал и заметил вот такое интересное явление Улыбающийся

Так и было задуманно? Улыбающийся
« Последнее редактирование: Август 16, 2013, 23:00 от gil9red » Записан

gil9red
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 1805



Просмотр профиля WWW
« Ответ #14 : Август 16, 2013, 23:12 »

Еще кое что нашел, связанно с изменением размера виджета, накрытого стеклом Улыбающийся
Сплиттером подвигал и заметил вот такое интересное явление Улыбающийся

Так и было задуманно? Улыбающийся

В функции bool SBGlass::eventFilter(QObject* /* object */, QEvent* event)
изменил строку 80 на return parent()->eventFilter(this, event); и такое явление пропало =)

Записан

Страниц: [1] 2   Вверх
  Печать  
 
Перейти в:  


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