Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > С/С++: Кроссплатформенное программирование, Qt/Gtk+/wxWidgets > рисование на виджете


Автор: gordmiand 25.5.2010, 20:07
рисую эллипс (окружность) прямо на форме:
Код

void Form1::paintEvent(QPaintEvent *event)
{
    QPainter p(this);
    p.setPen(QPen(color,3));
    p.setBrush(QBrush(color, Qt::SolidPattern));
    p.drawEllipse(10, 10,     15,     15);                                    
}

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

    QPainter p(my_Label);

но он мне пишет
QPainter::begin: Widget painting can only begin as a result of a paintEvent
QPainter::setPen: Painter not active
QPainter::setBrush: Painter not active

как будет правильно отрисовать окружность на лейбле?

Автор: SABROG 25.5.2010, 20:41
Рисуй на QPixmap и потом ставь его в QLabel. Можно конечно унаследоваться от QLabel и переопределить paintEvent() метод, или установить фильтр событий (installEventFilter) и рисовать в нем, но какой смысл перекрывать отрисовку для QLabel'a? Разве что нарисовать что-то поверх того, что он уже нарисовал.

Автор: gordmiand 26.5.2010, 20:25
 smile 
Код

    QPixmap s;
    QPainter p(&s);

    p.setPen(QPen(color,3));
    p.setBrush(QBrush(color, Qt::SolidPattern));

    p.drawEllipse(10, 9,     15,     15);                                 
    label->setPixmap(s);

что-то не выходит...как будет правильно? 

Автор: SABROG 26.5.2010, 21:38
Код

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

int main(int argc, char** argv)
{
    QApplication app(argc, argv);
    QPixmap pix(265, 25);
    pix.fill(Qt::transparent);

    QPen pen;
    QBrush brush(QColor(Qt::red));
    QFont font;
    font.setPointSize(24);
    QPointF baseline(0, pix.height()-1);

    QPainterPath path;
    path.addText(baseline, font, "Russian Federation");

    QPainter painter(&pix);
    painter.setRenderHint(QPainter::Antialiasing, true);
    painter.setRenderHint(QPainter::TextAntialiasing, true);
    painter.setBrush(brush);
    painter.setPen(pen);
    painter.drawPath(path);
    
    painter.end();

    pix.save("test.png");
    return 0;
}



user posted image

Автор: gordmiand 26.5.2010, 22:00
SABROG: что-то я все равно не понял - стоко всего только для вывода одной надписи Russiian Federation....
подправьте пож-та мой примерчик с окружностью - так будет понятнее что я  не так делаю при работе с этим пиксмапом...

Автор: SABROG 26.5.2010, 22:28
Обязательно нужно задать размер pixmap'a

Код

    QPixmap pix(265, 25);


Иначе будет null pixmap
Цитата

A null pixmap has zero width, zero height and no contents. You cannot draw in a null pixmap.


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

    pix.fill(Qt::transparent);


Завершить рисование прежде чем делать что-либо с картинкой, чтобы QPainter "освободил" ресурс
Код

painter.end();

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)