Я решил свою проблему с помощью второго дисплея, выполняющего внеэкранный рендеринг с другим разрешением. После этого рендеринга он передает texture2d на меньший «реальный» дисплей, который обрезает его для адаптации к меньшему разрешению. В любом случае, спасибо!
Я думаю, что проблема - Ваш 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()
в деструкторе
По причине я предполагаю: Как QPaintDevice
s обычно дважды буферизуются в QT4, QPainter::end()
мог бы быть то, куда изображение передается видеопамяти.
Необходимо инициализировать живописца с виджетом, который Вы хотите подрисовать.
Обычно это сделано с помощью конструктора, который берет a QPaintDevice
но можно также сделать это путем вызова begin()
.
void SimpleExampleWidget::paintEvent(QPaintEvent *)
{
QPainter painter(this);
painter.setPen(Qt::blue);
painter.setFont(QFont("Arial", 30));
painter.drawText(rect(), Qt::AlignCenter, "Qt");
}