可水平可垂直。
项目中尤其平板中,有时候需要类似控件的拖拽或者增值控制。直接上代码:
paintEvent
Q_UNUSED(event);
QPainter p(this);
p.setPen(Qt::blue);
const int w = width();
const int h = height();
if (w * h == 0)
return;
//p.fillRect(0, 0, width(), height(), Qt::red);
if(!mPressed)
{
if(mOrientation == Qt::Horizontal)
{
mWidth = w/2;
mRect = QRect(w/2-5,0,10,h);
}
else
{
mWidth = h/2;
mRect = QRect(0,h/2-5,w,10);
}
mPreDist = mAfterDist = (double)mWidth/(double)mRadio;
}
paintSpring(&p);
paintSlider(&p);
paintSpring
const int w = width();
const int h = height();
double dist = mPreDist;
double dist2 = mAfterDist;
if(mOrientation == Qt::Horizontal)
{
const int amplitude = qMin(3, h / 3);
const int base = h / 2;
int i = 0;
painter->setPen(Qt::blue);
int idx = 0;
for (i = 0; i < mWidth/dist; ++i)
{
painter->drawLine(i * dist, base - amplitude, i * dist + dist / 2, base + amplitude);
}
for(i = 0; i < (w-mWidth)/dist2;++i)
{
painter->drawLine(mWidth+i * dist2, base - amplitude, mWidth+i* dist2 + dist2 / 2.0, base + amplitude);
}
painter->setPen(Qt::blue);
idx = 0;
for (i = 0; i < mWidth/dist; ++i)
{
painter->drawLine(i * dist + dist / 2, base + amplitude, i * dist + dist, base - amplitude);
}
for(i = 0;i < (w-mWidth)/dist2; ++i)
{
painter->drawLine(mWidth+i * dist2 + dist2 / 2.0, base + amplitude, mWidth+i* dist2 + dist2, base - amplitude);
}
const int y = h/2;
painter->drawLine(0, y-10, 0, y+10);
painter->drawLine(w - 1, y-10, w - 1, y+10);
}else{
const int amplitude = qMin(3, w / 3);
const int base = w / 2;
int i = 0;
painter->setPen(Qt::blue);
int idx = 0;
if(dist <= 0)
dist = 1;
for (i = 0; i < mWidth / dist; ++i)
{
painter->drawLine(base - amplitude, i * dist, base + amplitude,i * dist + dist / 2);
}
for(i = 0;i < (h-mWidth)/dist2; ++i)
{
painter->drawLine(base - amplitude, mWidth + i * dist2, base + amplitude,mWidth + i * dist2 + dist2 / 2.0);
}
painter->setPen(Qt::blue);
idx = 0;
for (i = 0; i < mWidth / dist; ++i)
{
painter->drawLine(base + amplitude, i * dist + dist / 2, base - amplitude, i * dist + dist);
}
for(i = 0;i < (h-mWidth)/dist2; ++i)
{
painter->drawLine(base + amplitude, mWidth + i * dist2 + dist2 / 2.0, base - amplitude, mWidth + i * dist2 + dist2);
}
const int x = w/2;
painter->drawLine(x-10, 0, x+10, 0);
painter->drawLine(x-10, h - 1, x+10, h - 1);
}