Russian Qt Forum

Qt => Пользовательский интерфейс (GUI) => Тема начата: schmidt от Март 20, 2013, 09:10



Название: Изменение формы окна силами CSS - возможно ли?
Отправлено: 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() проблему не решает :)


Название: Re: Изменение формы окна силами CSS - возможно ли?
Отправлено: Bepec от Март 20, 2013, 09:22
Скорее всего нет.

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

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

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

PPS перенести бы тему в QSS.


Название: Re: Изменение формы окна силами CSS - возможно ли?
Отправлено: _OLEGator_ от Март 20, 2013, 09:28
Необходимо также указать окну Qt::FramelessWindowHint


Название: Re: Изменение формы окна силами CSS - возможно ли?
Отправлено: _OLEGator_ от Март 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();
}


Название: Re: Изменение формы окна силами CSS - возможно ли?
Отправлено: Bepec от Март 20, 2013, 09:49
А разве установка этого флага не создаёт маску?


Название: Re: Изменение формы окна силами CSS - возможно ли?
Отправлено: _OLEGator_ от Март 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 )


Название: Re: Изменение формы окна силами CSS - возможно ли?
Отправлено: Bepec от Март 20, 2013, 10:20
Ну не буду спорить. Так то равнозначные функции. Но решение проще, чем установка маски.

Очень рад, что получается так сделать :D Возможно использую в следующих проектах.


Название: Re: Изменение формы окна силами CSS - возможно ли?
Отправлено: GreatSnake от Март 20, 2013, 11:35
Ну не буду спорить. Так то равнозначные функции. Но решение проще, чем установка маски.
С чего это вдруг по своей сути совершенно разные функции стали равнозначными ???


Название: Re: Изменение формы окна силами CSS - возможно ли?
Отправлено: Bepec от Март 20, 2013, 12:01
Кхм. Я имел в виду, что результат, необходимый ТСсу может быть получен как той, так и иной функцией.

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



Название: Re: Изменение формы окна силами CSS - возможно ли?
Отправлено: GreatSnake от Март 20, 2013, 12:07
По умолчанию все окна имеют прямоугольную форму.
Единственный способ изменить форму - это указать граф.системе его границы через QWidget::setMask().
Прозрачность же работает в пределах заданной формы окна.
Так что это вещи из разных опер)


Название: Re: Изменение формы окна силами CSS - возможно ли?
Отправлено: Bepec от Март 20, 2013, 12:18
Кхм. То же самое, что конфигуратор и редактор конфигурационных файлов.

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

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


Название: Re: Изменение формы окна силами CSS - возможно ли?
Отправлено: GreatSnake от Март 20, 2013, 12:29
Мде, как же ты любишь разглагольствовать о вещах совершенно не разбираясь в их предметной области.
Да будет тебе известно, окно является ресурсом граф.системы и его формой она же и заведует причём независимо от активности приложения.


Название: Re: Изменение формы окна силами CSS - возможно ли?
Отправлено: _OLEGator_ от Март 20, 2013, 13:39
И setMask, насколько я помню, не дает возможности задавать полупрозрачные области, либо полностью прозрачно, либо нет.


Название: Re: Изменение формы окна силами CSS - возможно ли?
Отправлено: GreatSnake от Март 20, 2013, 13:44
И setMask, насколько я помню, не дает возможности задавать полупрозрачные области, либо полностью прозрачно, либо нет.
О какой полупрозрачности вообще можно рассуждать при 1-битовой маске, задача которой описать границы окна ???


Название: Re: Изменение формы окна силами CSS - возможно ли?
Отправлено: Bepec от Март 20, 2013, 13:54
Ну вот я свои заблуждения развеиваю потихоньку :)

"Единственное, что человек делает всегда искренне, — заблуждается." Хань Сян-цзы ©


Название: Re: Изменение формы окна силами CSS - возможно ли?
Отправлено: schmidt от Март 21, 2013, 09:32
Ход мыслей был такой:

1. "Спрятать" окно/виджет верхнего уровня, установив TranslucentBackground.
2. Явно заставить отрисоваться всех потомков виджета.

Но, я плохо понимаю, что значит

Цитировать
i.e., any non-opaque regions of the widgets will be translucent because the widget will have an alpha channel.

ибо после установки атрибута Qt::WA_TranslucentBackground перестает отрисовываться вообще что-либо от виджета - ни его самого, ни потомков, ни даже рамки окна.