Окно Qt Balloon из QFrame

Я хотел бы создать свое собственное окно Balloon для подсказок в Qt. Я начинаю с создания окна со скругленными углами.

Я использую класс, унаследованный от QFrame. Конструктор класса содержит:

this->setWindowFlags(Qt::Window | Qt::FramelessWindowHint);
Pal.setColor(QPalette::Background, Qt::yellow);
this->setAutoFillBackground(true);
this->setPalette(Pal);
this->setStyleSheet("QFrame {border-style: solid; border-width: 10px;"
                    "border-radius: 100px;"
                    "min-width: 10em; background-clip: padding; background-origin: content;}");

Но это не создает круглые углы при отображении с использованием функции-члена show(). Я получаю это:

введите здесь описание изображения

Как я могу избавиться от этих прямоугольных краев и сделать их прозрачными?

Если вам нужна дополнительная информация, пожалуйста, спросите.


person The Quantum Physicist    schedule 19.04.2015    source источник
comment
Я сомневаюсь, что то, что вы хотите, возможно без специального рисования в paintEvent().   -  person Greenflow    schedule 19.04.2015


Ответы (2)


Если мое предположение верно, вы ищете что-то вроде setMask!

По сути, вам нужно нарисовать прямоугольник с желаемым радиусом, а затем преобразовать его в QRegion, чтобы использовать его с setMask. См. ниже один из способов:

QPainterPath path;
path.addRoundedRect(rect(), 100, 100);
QRegion region = QRegion(path.toFillPolygon().toPolygon());
setMask(region);

И это будет результат:

введите здесь описание изображения

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

person Antonio Dias    schedule 19.04.2015
comment
Работает. Но только для виджетов верхнего уровня. - person Greenflow; 19.04.2015
comment
ОП пытаются сделать это с помощью безрамного окна. Это не удовлетворяет? - person Antonio Dias; 19.04.2015
comment
Ага. Я слишком много думал об этом. В настоящее время я делаю все свои графические интерфейсы с qml. Гораздо проще делать такие вещи. - person Greenflow; 19.04.2015
comment
Спасибо. Это работает, за исключением того, что окно меньше исходного. Вы знаете, как можно определить размер этого? - person The Quantum Physicist; 19.04.2015
comment
Минимальный размер должен быть диаметром, связанным с радиусом закругленного угла, в вашем случае минимальный размер должен быть 200 как для ширины, так и для высоты (и таким образом вы получите круг). - person Antonio Dias; 19.04.2015

person    schedule
comment
Хотя этот код может решить проблему, включая объяснение того, как и почему это решает проблему, действительно поможет улучшить качество. вашего сообщения и, вероятно, приведет к большему количеству голосов. Помните, что вы отвечаете на вопрос для будущих читателей, а не только для того, кто задает сейчас. Пожалуйста, отредактируйте свой ответ, чтобы добавить пояснения и указать, какие ограничения и предположения применяются. - person Artog; 11.09.2019