LINUX.ORG.RU

Qt5 QPainter и сглаживание

 


0

1

Все привет!

Когда программа получает сообщение по сокету, необходимо в углу иконки приложения нарисовать кружок и в центре кол-во новых сообщений.

Делаю так

    int count = get_new_messages_count();
    if(count) {
        QPixmap     pixmap(":/general/app_icon");
        QPainter    painter(&pixmap);
        QFont       font;
        QRect       rect;

        rect.setRect(pixmap.width() - 12, 0, 12, 12);
        painter.setRenderHint(QPainter::Antialiasing, true);
        painter.setRenderHint(QPainter::TextAntialiasing, true);
        font = painter.font();
        font.setPixelSize(7);
        painter.setFont(font);
        painter.setBrush(QColor(240, 58, 87));
        painter.setPen(Qt::NoPen);
        painter.drawEllipse(rect);
        painter.setPen(Qt::white);
        painter.drawText(rect, Qt::AlignCenter, QString::number(count));
        setWindowIcon(QIcon(pixmap));
    }
    else {
        setWindowIcon(QIcon(":/general/app_icon"));
    }

Иконка приложения в формате ico, залита в ресурсы. В меню «Пуск» отображается 16х16. Когда сообщений нет (т.е. я не рисую поверх иконки) иконка отображается отлично, однако, когда я рисую поверх нее круг с цыфрой, то новая иконка получается какая-то «пиксельная» (видно, что нет никакого сглаживания). Кто что может сказать, за раннее спасибо

1. В png переводить иконку пробовал? Зачем *.ico? Оно же кривое всегда.
2. Хотелось бы скриншотов.

EXL ★★★★★
()
Ответ на: комментарий от EXL

только что пробовал с png, залил аж 1024х1024, тоже самое... Забыл еще упоминуть, что на exe файл устанавливается иконка (тот самый .ico) стандартным способом Qt (через rc файл). Вот примеры норм плохо

energyclab
() автор топика
Ответ на: комментарий от energyclab

Странно, у меня всё работает.
Попробуй: https://gist.github.com/EXL/45b461438fab3c513407

git clone https://gist.github.com/45b461438fab3c513407.git IconTest

И открывай IconTest.pro Qt Creator'ом.

EXL ★★★★★
()
Последнее исправление: EXL (всего исправлений: 1)

Но так как ты делаешь - это костыли и неправильно.
В Windows правильно нужно делать так:
https://gist.github.com/EXL/77cb7a6661d0aaf42f48

git clone https://gist.github.com/77cb7a6661d0aaf42f48.git WinExtrasIconTest
EXL ★★★★★
()
Последнее исправление: EXL (всего исправлений: 1)
Ответ на: комментарий от EXL

Если ты имеешь ввиду, что мне надо не рисовать собственный круг а брать иконку, то, да, я знаю это. У меня была иконка, но с ней как раз и начались эти пиксели, далее я просто попробовал круг нарисовать средствами qt. Вообще странно, что у меня эти пиксели появились...

energyclab
() автор топика
Ответ на: комментарий от energyclab

Нет, я вовсе не имею это ввиду.

Тебе нужно использовать QtWinExtras и его фичи, если хочешь нормальную реализацию подобного функционала.

Изменять иконку окна каждый раз при получении события не нужно. Нужно крепить кружочек с цифрой иконкой-оверлеем в QWinTaskbarButton. Так правильнее. Скомпиль эти примеры и посмотри, как оно выглядит.

EXL ★★★★★
()
Ответ на: комментарий от EXL

[qoute] QtWinExtras

Спасибо за наводку, что то я не видел этого

energyclab
() автор топика
Ответ на: комментарий от EXL

Вообще я что пропустил такую штуку, сейчас примеры и overview посмотрел, не знал, что так можно, спасибо еще раз

energyclab
() автор топика

Если иконка - это .ico, то внутри может быть несколько картинок разных размеров. Вызывай QIcon::pixmap с нужным размером, чтобы получить QPixmap, на котором будешь рисовать.

unC0Rr ★★★★★
()
Ответ на: комментарий от unC0Rr

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

energyclab
() автор топика
Вы не можете добавлять комментарии в эту тему: топик перемещен в архив.