在 QWidget 上绘画以覆盖整个小部件

Posted

技术标签:

【中文标题】在 QWidget 上绘画以覆盖整个小部件【英文标题】:Painting on QWidget to cover whole widget 【发布时间】:2015-12-30 09:47:36 【问题描述】:

我在窗口中有一个 QWidget。窗口可以调整大小,小部件应拉伸以覆盖可能的最大区域。我正在这个 QWidget 上绘制一个图,并且我希望该图随窗口拉伸。目前它有效,但我觉得我可以这样做更清洁。

看起来是这样的:

调整大小后,这是我想要的样子:

目前这是可行的,但我正在这样做:

在小部件paintEvent() 中,我像这样计算比例因子

double scaleFactorX = (double) width() / m_xAxis.last();
double scaleFactorY = (double) height() / m_yAxis.last();

*注意 m_xAxis.last() 是要绘制的最大值。而width()和height()返回QWidget的宽高。

然后,当我绘制元素时,我将每个点与比例因子相乘,以将其拉伸到 QWidget 的宽度。我觉得有更好(更正确)的方法可以做到这一点,但我不确定该怎么做。

任何帮助将不胜感激。

【问题讨论】:

【参考方案1】:

您可以通过在 QPainter 上设置 QTransform 以更简单/更易读的方式执行此操作。

文档中的示例(当然,您可能对 .scale() 比对 .translate() 更感兴趣):

void CombinedTransformation::paintEvent(QPaintEvent *)

    QPainter painter(this);
    painter.setPen(QPen(Qt::blue, 1, Qt::DashLine));
    painter.drawRect(0, 0, 100, 100);

    QTransform transform;
    transform.translate(50, 50);
    transform.rotate(45);
    transform.scale(0.5, 1.0);
    painter.setTransform(transform);

    painter.setFont(QFont("Helvetica", 24));
    painter.setPen(QPen(Qt::black, 1));
    painter.drawText(20, 10, "QTransform");

【讨论】:

我之前尝试过使用QTransform,但问题是它会缩放字体大小和线宽。因此,当我绘制线宽为 2 的网格时,它变得太厚了。 所以请完整描述您正在尝试实现的目标(而不是您尝试实现目标的方式)。 我想要一个与小部件一起拉伸的图,而不必在绘制之前缩放每个值。这个答案会在绘制后缩放所有内容。 所以你应该能够使用 QTransform 来完成它想要的所有事情,并调用 QPainter w/o QTransform 来完成你仍然想手动完成的一些事情。请注意,即使您在没有 QTranform 的 QPainter 上编写文本以防止字体大小缩放,您仍然可以使用 QTransform 来计算坐标。另请注意,QPen.setWidth(0) 使您能够绘制 1 像素宽的线条,而不管 QTransform(所谓的化妆笔)。 或者另一方面,如果你只是想画一个情节,你可以使用这些免费提供的小部件:qcustomplot.com

以上是关于在 QWidget 上绘画以覆盖整个小部件的主要内容,如果未能解决你的问题,请参考以下文章

qwidget.setGeometry() 在 linux 上的位置不正确

覆盖对话框关闭时的QWidget事件?

QTextEdit 上的覆盖小部件

QWidget如何在子小部件中接收keyPressEvent

当小部件集更改时,调整 QWidget 的大小以仅保存当前小部件

QWidget::mousePressEvent() 同时在两个小部件上