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 ★
() автор топика
Вы не можете добавлять комментарии в эту тему: топик перемещен в архив.