Как я крашу QPainter?

Я решил свою проблему с помощью второго дисплея, выполняющего внеэкранный рендеринг с другим разрешением. После этого рендеринга он передает texture2d на меньший «реальный» дисплей, который обрезает его для адаптации к меньшему разрешению. В любом случае, спасибо!

7
задан Angie Quijano 18 April 2016 в 20:34
поделиться

3 ответа

Я думаю, что проблема - Ваш QPainter инициализация.

Вы могли просто создать QPainter как в ответе hydroe, это было бы похоже на это затем:

class PointDrawer: public QWidget {
    Q_OBJECT
public:
    PointDrawer(QWidget* obj=0): QWidget(obj) {}
    virtual void paintEvent(QPaintEvent*) {
        QPainter p(this)
        p.setPen(QPen(Qt::black, 3));
        int n = 8;
        while(...) {
                qreal fAngle = 2 * 3.14 * i / n;
                qreal x = 50 + cos(fAngle) * 40;
                qreal y = 50 + sin(fAngle) * 40;
                p.drawPoint(QPointF(x, y));
                        i++;
        }
    }
}

Это могло также использовать что-то вроде этого, но я действительно не рекомендую это (я просто предпочитаю другое решение):

class PointDrawer: public QWidget {
    Q_OBJECT
private:
    QPainter p;
public:
    PointDrawer(QWidget* obj=0): QWidget(obj) {}
    virtual void paintEvent(QPaintEvent*) {
        p.begin(this);
        p.setPen(QPen(Qt::black, 3));
        int n = 8;
        while(...) {
                qreal fAngle = 2 * 3.14 * i / n;
                qreal x = 50 + cos(fAngle) * 40;
                qreal y = 50 + sin(fAngle) * 40;
                p.drawPoint(QPointF(x, y));
                        i++;
        }
        p.end();
    }
}

QPainter::begin(this) и QPainter::end() вызовы важны во втором примере. В первом примере можно думать QPainter::begin(this) будучи названным в конструкторе и QPainter::end() в деструкторе

По причине я предполагаю: Как QPaintDevices обычно дважды буферизуются в QT4, QPainter::end() мог бы быть то, куда изображение передается видеопамяти.

7
ответ дан 6 December 2019 в 14:09
поделиться

Необходимо инициализировать живописца с виджетом, который Вы хотите подрисовать.
Обычно это сделано с помощью конструктора, который берет a QPaintDevice но можно также сделать это путем вызова begin().

0
ответ дан 6 December 2019 в 14:09
поделиться
void SimpleExampleWidget::paintEvent(QPaintEvent *)
{
     QPainter painter(this);
     painter.setPen(Qt::blue);
     painter.setFont(QFont("Arial", 30));
     painter.drawText(rect(), Qt::AlignCenter, "Qt");
}

http://doc.qt.digia.com/4.4/qpainter.html

8
ответ дан 6 December 2019 в 14:09
поделиться
Другие вопросы по тегам:

Похожие вопросы: