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

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

Страниц: [1] 2   Вниз
  Печать  
Автор Тема: Изменение формы окна силами CSS - возможно ли?  (Прочитано 6821 раз)
schmidt
Гость
« : Март 20, 2013, 09:10 »

В проекте нужно реализовать всплывающие немодальные уведомления поверх главного окна в форме контейнера со скругленными углами. Бросаться в первую очередь за paintEvent и отрисовывать/считать все "методом изобретения велосипеда" нет никакого желания Улыбающийся Хочется поручить всю работу таблицам стилей.

Пошел таким путем: нарисовал в дизайнере виджет с вложенным фреймом, к которому применил CSS:

Код:
background-color: rgb(0, 170, 255);
border: 1px solid black;
border-radius: 15px;

Теперь хочу чтобы сам виджет не отрисовывался, а рисовался только стилизованный фрейм. Однако, если я устанавливаю виджету атрибут Qt::WA_TranslucentBackground - вообще ничего не отрисовывается - ни виджет, ни фрейм. Может есть какой-то способ заставить явно отрисовываться потомков виджета в то время как сам он пребывал бы в состоянии TranslucentBackground ? ui->frame->show() проблему не решает Улыбающийся
Записан
Bepec
Гость
« Ответ #1 : Март 20, 2013, 09:22 »

Скорее всего нет.

Нельзя изменить форму окна силами CSS.

НО! Можно задать фигурную форму окна маской (оно будет фигурным, как тебе надо) и уже дальше на нём всякую гадость творить/рисовать.

PS Без дополнительных телодвижений не изменить. CSS в Qt это оформление.

PPS перенести бы тему в QSS.
« Последнее редактирование: Март 20, 2013, 09:26 от Bepec » Записан
_OLEGator_
Гость
« Ответ #2 : Март 20, 2013, 09:28 »

Необходимо также указать окну Qt::FramelessWindowHint
Записан
_OLEGator_
Гость
« Ответ #3 : Март 20, 2013, 09:42 »

to Bepec:
Код
C++ (Qt)
#include <QApplication>
#include <QFrame>
#include <QVBoxLayout>
 
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
 
QWidget widget;
QVBoxLayout* centralLayout = new QVBoxLayout(&widget);
 
widget.setWindowFlags(Qt::FramelessWindowHint);
widget.setAttribute(Qt::WA_TranslucentBackground);
 
QFrame* frame = new QFrame(&widget);
frame->setMinimumSize(100, 100);
frame->setStyleSheet("background-color: rgb(0, 170, 255); border: 1px solid black; border-radius: 15px;");
centralLayout->addWidget(frame);
 
widget.show();
 
return a.exec();
}
Записан
Bepec
Гость
« Ответ #4 : Март 20, 2013, 09:49 »

А разве установка этого флага не создаёт маску?
Записан
_OLEGator_
Гость
« Ответ #5 : Март 20, 2013, 10:02 »

Qt::WA_TranslucentBackground - Indicates that the widget should have a translucent background, i.e., any non-opaque regions of the widgets will be translucent because the widget will have an alpha channel. Setting this flag causes WA_NoSystemBackground to be set. On Windows the widget also needs the Qt::FramelessWindowHint window flag to be set. This flag is set or cleared by the widget's author.

Имхо, маска - это другое:
Код
C++ (Qt)
void QWidget::setMask ( const QBitmap & bitmap )
Записан
Bepec
Гость
« Ответ #6 : Март 20, 2013, 10:20 »

Ну не буду спорить. Так то равнозначные функции. Но решение проще, чем установка маски.

Очень рад, что получается так сделать Веселый Возможно использую в следующих проектах.
Записан
GreatSnake
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2921



Просмотр профиля
« Ответ #7 : Март 20, 2013, 11:35 »

Ну не буду спорить. Так то равнозначные функции. Но решение проще, чем установка маски.
С чего это вдруг по своей сути совершенно разные функции стали равнозначными Непонимающий
Записан

Qt 5.11/4.8.7 (X11/Win)
Bepec
Гость
« Ответ #8 : Март 20, 2013, 12:01 »

Кхм. Я имел в виду, что результат, необходимый ТСсу может быть получен как той, так и иной функцией.

Ну и не вижу большой разницы в создании маски по крайним пикселям и добавлением прозрачности той области виджета, в котором отсутствует фон (во всяком случае я себе так представляю работу этого флага).

Записан
GreatSnake
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2921



Просмотр профиля
« Ответ #9 : Март 20, 2013, 12:07 »

По умолчанию все окна имеют прямоугольную форму.
Единственный способ изменить форму - это указать граф.системе его границы через QWidget::setMask().
Прозрачность же работает в пределах заданной формы окна.
Так что это вещи из разных опер)
Записан

Qt 5.11/4.8.7 (X11/Win)
Bepec
Гость
« Ответ #10 : Март 20, 2013, 12:18 »

Кхм. То же самое, что конфигуратор и редактор конфигурационных файлов.

Форма окна при использовании этого флага тоже меняется. Визуально. Так же как и при использовании setMask. Не?

Ибо это в любом случае прямоугольное окно с прозрачностью в нужных местах. Не помню какой именно способ (то ли флаг, то ли mask), но помоему setMask и фигурная форма окна при зависании выдаёт чёрный прямоугольник Веселый
Записан
GreatSnake
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2921



Просмотр профиля
« Ответ #11 : Март 20, 2013, 12:29 »

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

Qt 5.11/4.8.7 (X11/Win)
_OLEGator_
Гость
« Ответ #12 : Март 20, 2013, 13:39 »

И setMask, насколько я помню, не дает возможности задавать полупрозрачные области, либо полностью прозрачно, либо нет.
Записан
GreatSnake
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2921



Просмотр профиля
« Ответ #13 : Март 20, 2013, 13:44 »

И setMask, насколько я помню, не дает возможности задавать полупрозрачные области, либо полностью прозрачно, либо нет.
О какой полупрозрачности вообще можно рассуждать при 1-битовой маске, задача которой описать границы окна Непонимающий
Записан

Qt 5.11/4.8.7 (X11/Win)
Bepec
Гость
« Ответ #14 : Март 20, 2013, 13:54 »

Ну вот я свои заблуждения развеиваю потихоньку Улыбающийся

"Единственное, что человек делает всегда искренне, — заблуждается." Хань Сян-цзы ©
Записан
Страниц: [1] 2   Вверх
  Печать  
 
Перейти в:  


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