我正在做一个带有绘图表面的软件,它代表一个绘图(就像一个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)
答案 0 :(得分:2)
嗯,我想我能够做到这一点:
http://harmattan-dev.nokia.com/docs/library/html/qt4/qscrollbar.html
在许多常见情况下,文档长度,滚动条中使用的值范围和页面步骤之间的关系很简单。滚动条的值范围是通过从表示文档长度的某个值中减去所选页面步长来确定的。在这种情况下,以下等式很有用:文档长度=最大值() - 最小值()+ pageStep()。
所以在我的情况下,长度是点的数量,我可以将minimum()设置为0.所以,正如你在图片上看到的那样,做一些像QScrollArea这样的事情。比例为:PercentageVisible = PageStep / Length,另一个等式为Length = PageStep + Max。
我有两个方程式,两个缺失值(PageStep和Maximum)和两个已知值(PercentageVisible和Length)。
示例:我有1024个点,但只显示了75%。
0.75 = PageStep / 1024 ----------> PageStep = 768
1024 = Max + 768 ---------------->最大值= 256
您可以在软件中试用它,它会起作用。我知道没有那么多人需要重现这一点,因为QScrollArea将在大多数情况下完成工作。
例如,此代码位于从resize事件响应的插槽中:
ui.sbarRange->setPageStep(u64SampleCount * dRatio);
ui.sbarRange->setMaximum(u64SampleCount - ui.sbarRange->pageStep());
答案 1 :(得分:1)
您可以创建新的QWidget子类并重新实现sizeHint
和paintEvent
。在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
快速。