【问题标题】:Painting on QWidget to cover whole widget在 QWidget 上绘画以覆盖整个小部件
【发布时间】: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 的宽度。我觉得有更好(更正确)的方法可以做到这一点,但我不确定该怎么做。

任何帮助将不胜感激。

【问题讨论】:

    标签: qt plot drawing qwidget qpainter


    【解决方案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
    猜你喜欢
    • 2013-10-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-02-13
    • 1970-01-01
    • 2012-04-01
    相关资源
    最近更新 更多