I am doing a software with a drawing surface that represent a plot (like a sin function) (A child of QWidget) and I would like to have a QScrollBar acting like a QScrollArea. So if my drawing widget show show 750 dots (my plot is made of dots), but there are 1000 dots, I would like the slider of the ScrollBar to fill 75% of the available space.
I can't use a QScrollArea because the scroll is proportionnal with the size of the widget it contains. In my case, the scroll must be proportionnal with the number of dots on the screen. I know how to get my ratio, but I don't know how to setup correctly the QScrollBar
Example: I edited the value of PageStep, but I don't understand how this work. I can set pageStep to 100 with a range of [0,99] and it will fill the half of the QScrollBar.
My interface:
QWidget (Vertical Layout) //Main Widget
Drawing Surface (Child of QWidget)
QScrollBar (Horizontal)
嗯,我想我能够做一些与此:
http://harmattan-dev.nokia.com/docs/library/html/qt4/qscrollbar.html
一个文件长度,在滚动条中使用的值的范围内,并且在网页步骤之间的关系是在许多常见的情况简单。 值的滚动条的范围是通过从表示该文档的长度的一些值选定页面步骤中确定。 在这种情况下,下面的等式是有用:文档长度=最大() - 最小值()+ pageStep()。
所以在我的情况下,长度为点数,我可以这样设定最低()为0,你可以在图片中看到,像做QScrollArea。 的比例为:PercentageVisible = PageStep /长度和另一个方程是长度= PageStep +最大。
我有两个方程中,两个缺失值(PageStep和最大)和两个已知值(PercentageVisible和长度)。
例如:我有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());
您可以创建一个新的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万个像素)。 所以完全重绘或内存分配不会发生。 你只需要保持你paintEvent
快。