Четверг, 07.01.2021 07:51

Изменяем цвет и шрифт подписи - Виджеты в Qt. Часть 5

Изменяем цвет и шрифт подписи - Виджеты в Qt. Часть 5

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

Мы будем использовать проект из предыдущей статьи.

Изменяем цвет подписи

Добавим поле для хранения цвета подписи и сеттер/геттер:  

private:
    QString captionColor;

QString QLampWidget::getCaptionColor() const
{
    return captionColor;
}

void QLampWidget::setCaptionColor(const QString &value)
{
    captionColor = value;
    repaint();
}

 Во все конструкторы виджета добавим строку:

    this->captionColor = "#000";

 В методе paintEvent() перед строкой

    painter.drawText(QPoint(0,40),this->getCaption());

добавим

    painter.setPen(QPen(QColor(this->captionColor), 1));

Запустим:

Изображение удалено.

Подписи стали черными.

Теперь добавим в конструктор главной формы строки:

lamp->setCaptionColor("#F00");
lamp2->setCaptionColor("#00F");

Запустим:

Изображение удалено.

Мы можем контролировать цвет подписей для лампочек.

Изменяем шрифт лампочки

Добавим поле класса для хранения информации о шрифте подписи:  

private:
    QFont captionFont;

QFont QLampWidget::getCaptionFont() const
{
    return captionFont;
}

void QLampWidget::setCaptionFont(const QFont &value)
{
    captionFont = value;
    repaint();
}

Добавим в конструкторы нашего виджета строку:

    this->captionFont = this->font();

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

Добавим в метод paintEvent() перед

painter.drawText(QPoint(0,40),this->getCaption());

строку

painter.setFont(this->captionFont);

Запустим – ничего не изменилось.

В конструктор главной формы добавим строки:

lamp->setCaptionFont(QFont("Courier new"));
lamp2->setCaptionFont(QFont("System"));

Запустим:

Изображение удалено.

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

Чтобы исправить эту ошибку перенесем в методе paintEvent() строку

painter.setFont(this->captionFont);

поместив её перед

QFontMetrics metrics(painter.font());

Запустим:

Изображение удалено.

Теперь текст отображается корректно.

Изменяем размер шрифта

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

lamp->setCaptionFont(QFont("Courier new"));

на строки

    QFont font = QFont("Courier new");
    font.setPixelSize(24);
    lamp->setCaptionFont(font);

Запустим:

Изображение удалено.

Размер шрифта поменялся.

Исправление бага с размером виджета и шрифта

Давайте попробуем увеличить размер лампочки и надписи:

    lamp = new QLampWidget("#557d00","#F00",QLampWidget::on, 64, "1");
    hlay1->addWidget(lamp);
    lamp->setCaption("Lamp 1"); 

    QFont font = QFont("Courier new");
    font.setPixelSize(32);
    lamp->setCaptionFont(font);

Запустим:

Изображение удалено.

Текст неправильно отрисовывается по вертикали.

Всё дело в том, что мы не учитываем размер лампочки при выводе текста:

    painter.drawText(QPoint(0,40),this->getCaption());

Исправим эту строку на:

    painter.drawText(QPoint(0,this->getLampSize()+heightOfText/2),this->getCaption());

Запустим:

Изображение удалено.

Теперь вне зависимости от размера лампочки и шрифта подпись находится в верном положении.

Заключение

Сегодня мы добавили возможность изменять цвет подписи нашего виджета.

Были добавлены методы для смены шрифта подписи.

Был рассмотрен способ изменения размера шрифта подписи.

Исправили положение подписи при изменении размера лампочки и шрифта.

Исходный код вы можете найти на GitFlic

Категория Виджеты

Добавить комментарий

Простой текст

  • HTML-теги не обрабатываются и показываются как обычный текст
  • Строки и абзацы переносятся автоматически.
  • Адреса веб-страниц и email-адреса преобразовываются в ссылки автоматически.
Просмотров: 377