Создание окна произвольной формы

Чтобы создать окно произвольной формы следует выполнить следующие шаги:

  • создать изображение нужной формы с прозрачным фоном и сохранить его, например, в формате PNG;
  • создать экземпляр класса QPixmap, передав конструктору класса абсолютный или относительный путь к изображению;
  • установить изображение в качестве фона окна с помощью палитры;
  • отделить альфа-канал с помощью метода mask() из класса QPixmap. Прототип метода:
QBitmap mask() const
  • передать маску в метод setMask() объекта окна. Прототип метода:
void setMask(const QBitmap &bitmap)
  • убрать рамку окна, например, передав комбинацию следующих флагов:
Qt::Window | Qt::FramelessWindowHint

Если для создания окна используется класс QLabel, то вместо установки палитры можно передать экземпляр класса QPixmap в метод setPixmap(), а маску в метод setMask(). Прототипы методов:

void setPixmap(const QPixmap &)
void setMask(const QBitmap &bitmap)

В качестве примера создадим круглое окно с кнопкой, с помощью которой можно закрыть окно. Окно выведем без заголовка и границ (листинг 3.12).

Листинг 3.12. Создание окна произвольной формы

#include <QApplication>
#include <QWidget>
#include <QPushButton>
#include <QPalette>
#include <QPixmap>
#include <QBrush>

int main(int argc, char *argv[])
{
   QApplication app(argc, argv);
   QWidget window;
   window.setWindowTitle("Создание окна произвольной формы");
   window.setWindowFlags(Qt::Window | Qt::FramelessWindowHint);
   window.resize(300, 300);

   QPixmap pixmap("C:\\cpp\\projectsQt\\Test\\fon.png");
   QPalette pal = window.palette();
   pal.setBrush(QPalette::Normal, QPalette::Window,
                QBrush(pixmap));
   pal.setBrush(QPalette::Inactive, QPalette::Window,
                QBrush(pixmap));
   window.setPalette(pal);
   window.setMask(pixmap.mask());

   QPushButton *button = new QPushButton("Закрыть окно", &window);
   button->setFixedSize(150, 30);
   button->move(75, 135);
   QObject::connect(button, SIGNAL(clicked()),
                    qApp, SLOT(quit()));
   window.show();
   return app.exec();
}

Учебник C++ (Qt Creator и MinGW)
Учебник C++ (Qt Creator и MinGW) в формате PDF

Помощь сайту

ЮMoney (Yandex-деньги): 410011140483022

ПАО Сбербанк:
Счет: 40817810855006152256
Реквизиты банка:
Наименование: СЕВЕРО-ЗАПАДНЫЙ БАНК ПАО СБЕРБАНК
Корреспондентский счет: 30101810500000000653
БИК: 044030653
КПП: 784243001
ОКПО: 09171401
ОКОНХ: 96130
Скриншот реквизитов