c++ - 在paintEvent中警告QPainter
问题描述
我试图在 QChartView 中绘制更多信息,所以我重新实现了paintEvent
virtual void paintEvent(QPaintEvent *event) {
QChartView::paintEvent(event);
OmenChart *mchr = dynamic_cast<OmenChart *>(this->chart());
if(mchr == nullptr)
return;
QPainter painter(this);
const int labelOffset = 2 + 2;
painter.setFont(this->font());
painter.setPen(QPen(Qt::black));
QFontMetrics fm(painter.font());
const OmenScatterSeries *omnSr = mchr->serie();
QVector<QPointF> points = omnSr->pointsVector();
QStringList labels = omnSr->pointLabels();
for (int i(0); i < labels.count(); i++) {
QString pointLabel = labels[i];
// Position text in relation to the point
int pointLabelWidth = fm.width(pointLabel);
QPointF position(points.at(i));
position.setX(position.x() - pointLabelWidth / 2);
position.setY(position.y() - labelOffset);
painter.drawText(position, pointLabel);
}
}
我正在接受这些错误
QWidget::paintEngine: Should no longer be called
QPainter::begin: Paint device returned engine == 0, type: 1
QPainter::setFont: Painter not active
QPainter::setPen: Painter not active
QPainter::font: Painter not active
QWidget::paintEngine: Should no longer be called
对此有什么想法吗?我也使用了painter.begin 和end 但我犯了同样的错误
解决方案
不要在QChartView的子类上绘制,而是在其视口上绘制。
QChartView派生自QGraphicsView,后者又派生自QAbstractScrollArea,根据此答案(以及引用的文档),您应该将视口用作QPainter的绘画设备,而不是小部件本身。
所以,而不是
QPainter painter(this);
写
QPainter painter(viewport());
在QGraphicsView的源代码中也可以看到相同的内容,即:
// Set up the painter
QPainter painter(viewport());
推荐阅读
- laravel - 根据单击的按钮存储值
- rust - 将 actix_web 响应的主体提取到字符串中的正确方法是什么?
- python - conda 可以全局安装包还是所有包都安装到特定环境?
- typescript - 打字稿和 (a, b) => a+b
- powerbi - Dax Measure - 无法使用日期切片
- android - 在 SPA 的情况下不调用 shouldOverrideUrlLoading 方法
- .htaccess - .htaccess 到 web.config iis 问题路由
- python - 根据特定的行键条件在熊猫中插入一列
- c - 为什么输入函数不能跟随输出函数,反之亦然?
- javascript - 尝试保存对象/数组时出现 React JS 问题 - Canvas Signature Pad