我正在做一个带有绘图表面的软件,它表示一个绘图(如sin函数)(QWidget的子代),我希望有一个像QScrollArea一样的QScrollBar。因此,如果我的绘图小部件显示750个点(我的图是由点组成的),但有1000个点,我希望ScrollBar的滑块填满75%的可用空间。
我不能使用QScrollArea,因为滚动与它所包含的小部件的大小成比例。在我的例子中,卷轴必须与屏幕上的点数成比例。我知道如何获得我的比率,但我不知道如何正确设置QScrollBar
例如:我编辑了PageStep的值,但我不明白它是如何工作的。我可以将pageStep设置为100,范围为0,99,它将填充QScrollBar的一半。
我的界面:
QWidget (Vertical Layout) //Main Widget
Drawing Surface (Child of QWidget)
QScrollBar (Horizontal)发布于 2013-07-03 21:42:14
嗯,我想我可以用这个做点什么:
http://harmattan-dev.nokia.com/docs/library/html/qt4/qscrollbar.html

在许多常见情况下,文档长度、滚动条中使用的值范围和页面步骤之间的关系很简单。滚动条的值范围是通过从表示文档长度的某个值中减去选定的页面步长来确定的。在这种情况下,下面的公式很有用:文档长度= maximum() - minimum() + pageStep()。
因此,在我的例子中,长度是点的数量,我可以将minimum()设置为0。所以,就像你在图片上看到的,做一些像QScrollArea这样的事情。比例是: PercentageVisible = PageStep / Length,另一个方程是Length = PageStep + Max。
我有两个等式,两个缺失值(PageStep和Maximum)和两个已知值(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-03 03:54:33
您可以创建一个新的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();这个示例可以很好地处理非常大的小部件(例如,100000像素)。所以完全重绘或内存分配不会发生。你只需要保持你的paintEvent很快。
https://stackoverflow.com/questions/17432534
复制相似问题