4

我想拦截 QSlider 上的 QPaintEvent 并绘制它。但我找不到关于事物几何形状的细节。我可以知道整个小部件的 rect() ,但是你怎么知道小部件矩形中第一个刻度线或最后一个刻度线的位置?(跟踪通道左右有边距)。还是“手柄”的矩形?

4

3 回答 3

9

感谢回复中的提示。经过一番调查,这似乎有效。如果它对某人有用:

QStyleOptionSlider opt;
slider->initStyleOption(&opt);

QStyle *styl=style();
Rect rectHandle=styl->subControlRect(QStyle::CC_Slider, &opt, QStyle::SC_SliderHandle, NULL);
Rect rectGroove=styl->subControlRect(QStyle::CC_Slider, &opt, QStyle::SC_SliderGroove, NULL);

int avl=styl->pixelMetric(QStyle::PM_SliderSpaceAvailable, &opt, this); // width in an horizontal slider of the groove (width of widget - margins)
于 2013-08-05T15:59:52.717 回答
1

您是否考虑过改用 setStyleSheet ?如果真的想自己画,可以看一下Qt源码中是怎么做的:qt/src/gui/widgets/qslider.cpp

于 2013-08-05T10:26:56.707 回答
1

您确定要重新实现绘画事件吗?
编写自定义样式表就足够了吗?
这是来自 doks 的 qslider 示例:

 QSlider::groove:horizontal {
     border: 1px solid #999999;
     height: 8px; /* the groove expands to the size of the slider by default. by giving it a height, it has a fixed size */
     background: qlineargradient(x1:0, y1:0, x2:0, y2:1, stop:0 #B1B1B1, stop:1 #c4c4c4);
     margin: 2px 0;
 }

 QSlider::handle:horizontal {
     background: qlineargradient(x1:0, y1:0, x2:1, y2:1, stop:0 #b4b4b4, stop:1 #8f8f8f);
     border: 1px solid #5c5c5c;
     width: 18px;
     margin: -2px 0; /* handle is placed by default on the contents rect of the groove. Expand outside the groove */
     border-radius: 3px;
 }
于 2013-08-05T10:24:41.120 回答