在 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如何在子小部件中接收keyPressEvent