Страницы

Поиск по вопросам

среда, 22 января 2020 г.

Как заставить Qpainter рисовать на нужном виджете.

#qt #cpp


Есть форма, на которой много чего, включая один пустой виджет graphArea. QPainter
создается следующим образом:

fPainter = new QPainter(ui->graphArea);


После чего рисую прямоугольник:

fPainter->begin(this);
fPainter->setRenderHint(QPainter::Antialiasing);

fPainter->setBrush(QColor(255,255,255));
fPainter->drawRect(0,0,ui->graphArea->width(),ui->graphArea->height());
fPainter->end();


А рисуется он начиная от левого верхнего угла формы, а не на виджете.
Как заставить его рисовать на виджете? На чем вообще лучше рисовать?

UPD: По совету @1101_debian пытаюсь рисовать теперь на QGraphicsView.
Вот весь код paintEvent:
    fPainter = new QPainter(this);
    QGraphicsView *pGraphArea = ui->graphArea;

fPainter->begin(pGraphArea);
fPainter->setRenderHint(QPainter::Antialiasing);

fPainter->setPen(Qt::black);
fPainter->drawRect(pGraphArea->x(),pGraphArea->y(),pGraphArea->width(),pGraphArea->height());

for (int i= pGraphArea->x(); i < pGraphArea->width(); i += 96/2.54)
    for (int j = pGraphArea->y(); j < pGraphArea->height(); j += 96/2.54)
         fPainter->drawPoint(i,j);

fPainter->end();
event->ignore();


Получилось вот так:


т.е. рисуется, но опять же за пределами QGraphicsView. Что не так делаю?
    


Ответы

Ответ 1



Попробуйте передать в fPainter->begin ваш виджет на котором вы хотите рисовать. fPainter->begin(ui->graphArea); А вообще я бы для этого использовал QGraphicsScene и QGraphicsView. UPD. Официальный мануал от Nokia

Ответ 2



Вы про это или нет, но у QWidget есть такой классный метод, как render(): void QWidget::render( QPaintDevice * target, const QPoint & targetOffset = QPoint(), const QRegion & sourceRegion = QRegion(), RenderFlags renderFlags = RenderFlags(DrawWindowBackground | DrawChildren) ) Самое прямое применение (пример из Qt Assistant): QPainter painter(this); // ... painter.end(); myWidget->render(this); Рисует или нет не проверял, но весь виджет в QPainter передаётся исправно. Лично я передавал на печать(через класс QPrinter) целый виджет: QPrinter *printer = new QPrinter(QPrinter::HighResolution); printer->setPageSize(QPrinter::A4); printer->setOrientation(QPrinter::Portrait); printer->setPageMargins (15,15,15,15,QPrinter::Millimeter); printer->setFullPage(true); printer->setOutputFileName("output.pdf"); printer->setOutputFormat(QPrinter::PdfFormat); QPainter *painter = new QPainter; painter->begin(printer); QRect view(0,0,printer->pageRect().width(),printer->paperRect().height()); painter->setViewport(view); painter->scale(10.0,10.0); painter->setRenderHint(QPainter::Antialiasing); this->render(painter); painter->end();

Комментариев нет:

Отправить комментарий