Получите эффект размытия, подобный iOS7, с помощью Qt

Я спрашивал себя, как я могу получить эффект размытия/прозрачности, подобный iOS 7. Что-то вроде этого:

Эффект размытия на iOS7
(источник: ilounge.com)

Я хотел бы применить это ко всему QDialog. Я знаю, как получить хорошую прозрачность, но не знаю, как получить это размытие.

Кто-нибудь может помочь?

Большое спасибо!


person X99    schedule 09.11.2013    source источник
comment
Забудьте о QtWidgets. Для этого вам нужен QML.   -  person peppe    schedule 10.11.2013
comment
У вас есть пример для этого? Кстати, я думаю, что это вполне осуществимо, используя подход Qt C++, это моя цель здесь.   -  person X99    schedule 10.11.2013


Ответы (2)


По сути, вам нужно сначала сделать скриншот рабочего стола. Затем нужно его размыть. Затем, вероятно, сохраните изображение на жесткий диск. Затем вам нужно установить его в качестве фона для вашего диалога.

И тогда вам нужно сделать фон для каждой кнопки прозрачным.

Если вы используете QGraphicsView или OpenGL, последние три шага могут сильно отличаться.

http://qt-project.org/doc/qt-5.0/qtgui/qscreen.html#grabWindow

http://qt-project.org/doc/qt-5.0/qtwidgets/desktop-screenshot.html

Строки кода, где он фактически захватывает экран:

QScreen *screen = QGuiApplication::primaryScreen();
if (screen)
    originalPixmap = screen->grabWindow(0);

В Qt 4.8 раньше это делалось так:

http://qt-project.org/doc/qt-5.0/qtgui/qpixmap.html#grabWindow

Чтобы размыть скриншот, используйте это:

http://doc-snapshot.qt-project.org/4.8/qgraphicsblureffect.html

Вам может понадобиться сохранить его на жесткий диск, чтобы QStylesheets мог его найти.

Чтобы установить фоновое изображение, попробуйте что-то вроде этого:

http://qt-project.org/doc/qt-5.0/qtwidgets/stylesheet-reference.html#background-image-prop

Пример установки таблицы стилей:

qApp->setStyleSheet("QLineEdit { background-color: yellow }");

http://qt-project.org/doc/qt-4.8/stylesheet-examples.html

http://qt-project.org/forums/viewthread/1397

Надеюсь, это поможет.

person phyatt    schedule 10.11.2013
comment
Нет абсолютно никакой необходимости сохранять что-либо на жесткий диск или использовать таблицы стилей. Вы можете использовать пользовательский класс, производный от QDialog или QWidget, который рисует свой фон по вашему желанию, а затем создать виджет с прозрачным фоном с элементами управления, которые вы хотите поверх него. - person Kuba hasn't forgotten Monica; 12.11.2013
comment
Вскоре я посмотрю, смогу ли я собрать рабочий пример на основе ваших предложений, @KubaOber. Спасибо! - person phyatt; 12.11.2013

Большое спасибо phyatt за помощь, у меня получилось. Хотя мой код работает, результат не такой красивый, как у iOS:

Размытие в стиле iOS7 с помощью Qt

однако я собираюсь опубликовать весь код на своем веб-сайте, я опубликую ссылку здесь через некоторое время.

Быть в курсе!

[EDIT] вот ссылка на подробное руководство: эффект размытия в стиле iOS7 с QT

person X99    schedule 10.11.2013