我想截取QSlider上的QPaintEvent并绘制它。但我找不到关于它的几何结构的详细信息。我可以知道整个小部件的rect(),但如何判断小部件矩形中第一个tickmark或最后一个tickmrk的位置?(在跟踪通道的左侧和右侧有一个空白)。还是"手柄"的矩形?
以下是使用QStyleOptionSlider和QStyle:的方法
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);
// width in an horizontal slider of the groove (width of widget - margins)
int avl=styl->pixelMetric(QStyle::PM_SliderSpaceAvailable, &opt, this);
您是否考虑过使用setStyleSheet?如果你真的想自己画,你可以看看它是如何在Qt源代码中完成的:Qt/src/gui/widgets/qslider.cpp
编写一个自定义样式表就足够了。
以下是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;
}