0

我正在做一个带有表示绘图的绘图表面的软件(如 sin 函数)(QWidget 的子级),我希望 QScrollBar 像 QScrollArea 一样。因此,如果我的绘图小部件显示 750 个点(我的绘图由点组成),但有 1000 个点,我希望 ScrollBar 的滑块填充 75% 的可用空间。

我不能使用 QScrollArea 因为滚动与其包含的小部件的大小成比例。就我而言,滚动必须与屏幕上的点数成比例。我知道如何获得我的比率,但我不知道如何正确设置 QScrollBar

示例:我编辑了 PageStep 的值,但我不明白它是如何工作的。我可以将 pageStep 设置为 100,范围为 [0,99],它将填充 QScrollBar 的一半。

我的界面:

QWidget (Vertical Layout) //Main Widget
    Drawing Surface (Child of QWidget)
    QScrollBar (Horizontal)
4

2 回答 2

2

好吧,我想我可以用这个做点什么:

http://harmattan-dev.nokia.com/docs/library/html/qt4/qscrollbar.html

在此处输入图像描述

在许多常见情况下,文档长度、滚动条中使用的值范围和页面步长之间的关系很简单。滚动条的值范围是通过从代表文档长度的某个值中减去选定的页面步长来确定的。在这种情况下,以下等式很有用:文档长度 = maximum() - minimum() + pageStep()。

所以在我的例子中,长度是点的数量,我可以将 minimum() 设置为 0。所以,正如你在图片上看到的那样,做一些类似 QScrollArea 的事情。比例是:PercentageVisible = PageStep / Length,另一个等式是 Length = PageStep + Max。

我有两个方程,两个缺失值(PageStep 和最大值)和两个已知值(PercentageVisible 和 Length)。

示例:我有 1024 个点,但只显示了其中的 75%。

0.75 = PageStep / 1024 ----------> PageStep = 768

1024 = 最大值 + 768 ----------------> 最大值 = 256

您可以在您的软件中尝试它,它会起作用。我知道没有多少人需要重现这个,因为 QScrollArea 在大多数情况下都会完成这项工作。

例如,此代码位于响应调整大小事件的插槽中:

ui.sbarRange->setPageStep(u64SampleCount * dRatio);
ui.sbarRange->setMaximum(u64SampleCount - ui.sbarRange->pageStep());
于 2013-07-03T13:42:13.780 回答
1

您可以创建一个新的 QWidget 子类并重新实现sizeHintpaintEvent. 在中paintEvent您可以使用event->rect()来确定当前暴露和需要绘制的区域。请注意,paintEvent如果您不希望窗口冻结,则必须快速。您还需要将创建的小部件放入QScrollArea.

这是一个绘制正弦曲线的简单示例:

class SinWidget : public QWidget {
public:
  QSize sizeHint() const {
    return QSize(10000, 200);
  }

  void paintEvent(QPaintEvent* event) {
    QPainter painter(this);
    for(int x = event->rect().left(); x <= event->rect().right(); x++) {
      painter.drawPoint(x, 100.0 + qSin(0.05 * x) * 20.0);
    }
  }
};

QScrollArea area;
area.setWidget(new SinWidget());
area.show();

此示例适用于非常大的小部件尺寸(例如 100 000 像素)。所以完全重绘或内存分配不会发生。你只需要保持你的paintEvent禁食。

于 2013-07-02T19:54:32.990 回答