Как создать значок круга из файла изображения? - PullRequest
0 голосов
/ 01 января 2012

В моем настроенном методе QWidget paintEvent я хочу нарисовать круг с иконкой изображения в форме круга. Исходное изображение загружается из файла, а затем автоматически помещается в круг, используя композицию QPainter. Как это сделать? Спасибо!

void DotGraphView::paintNodes(QPainter & painter)
{
    painter.setPen(Qt::blue);
    painter.drawEllipse(x, y, 36, 36);
    QPixmap icon("./image.png");
    QImage fixedImage(64, 64, QImage::Format_ARGB32_Premultiplied);
    QPainter imgPainter(&fixedImage);
    imgPainter.setCompositionMode(QPainter::CompositionMode_SourceIn);
    imgPainter.drawPixmap(0, 0, 64, 64, icon);
    imgPainter.setCompositionMode(QPainter::CompositionMode_SourceIn);
    imgPainter.setBrush(Qt::transparent);
    imgPainter.drawEllipse(32, 32, 30, 30);
    imgPainter.end();
    painter.drawPixmap(x, y, 64, 64, QPixmap::fromImage(fixedImage));
}

Приведенный выше код не работает. Выходной дисплей не является изображением в форме круга.

Ответы [ 2 ]

3 голосов
/ 01 января 2012

Не знаю, правильно ли я понял, но это может сделать то, что вы хотите:

#include <QtGui/QApplication>
#include <QLabel>
#include <QPixmap>
#include <QBitmap>
#include <QPainter>

int main(int argc, char *argv[])
{
   QApplication a(argc, argv);

   // Load the source image.
   QPixmap original(QString("/path/here.jpg"));
   if (original.isNull()) {
      qFatal("Failed to load.");
      return -1;
   }

   // Draw the mask.
   QBitmap  mask(original.size());
   QPainter painter(&mask);
   mask.fill(Qt::white);
   painter.setBrush(Qt::black);
   painter.drawEllipse(QPoint(mask.width()/2, mask.height()/2), 100, 100);

   // Draw the final image.
   original.setMask(mask);

   // Show the result on the screen.
   QLabel label;
   label.setPixmap(original);
   label.show();

   return a.exec();
}

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

0 голосов
/ 01 января 2012

Вы можете сделать это относительно просто с помощью обтравочного контура:

QPainter painter(this);
painter.setPen(Qt::blue);
painter.drawEllipse(30, 30, 36, 36);
QPixmap icon("./image.png");

QImage fixedImage(64, 64, QImage::Format_ARGB32_Premultiplied);
fixedImage.fill(0);  // Make sure you don't have garbage in there

QPainter imgPainter(&fixedImage);
QPainterPath clip;
clip.addEllipse(32, 32, 30, 30);  // this is the shape we want to clip to
imgPainter.setClipPath(clip);
imgPainter.drawPixmap(0, 0, 64, 64, icon);
imgPainter.end();

painter.drawPixmap(0, 0, 64, 64, QPixmap::fromImage(fixedImage));

(я бы кэшировал растровые изображения, если вы будете делать это часто.)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...