1. 绘制窗体的阴影
void ShadowWidget::paintEvent(QPaintEvent * event)
{
QDialog::paintEvent(event);
// 设置除阴影外,其他部分的窗体样式;
QPainterPath pathShadow;
pathShadow.setFillRule(Qt::WindingFill);
pathShadow.addRect(10, 10, this->width() - 20, this->height() - 20);
QPainter painter(this);
painter.setRenderHint(QPainter::Antialiasing, true);
painter.fillPath(pathShadow, QBrush(Qt::white));
QColor color(0, 0, 0, 50);
for(int i=0; i<10; i++)
{
QPainterPath path;
path.setFillRule(Qt::WindingFill);
// 绘制多个矩形 用透明度 来描绘阴影
path.addRect(10-i, 10-i, this->width()-(10-i)*2, this->height()-(10-i)*2);
// 透明度 由深入浅
color.setAlpha(150 - qSqrt(i)*50);
painter.setPen(color);
painter.drawPath(path);
}
}
2. 创建可拖动 的 窗体:
【注意】
通过函数 globalPos() 返回的全局坐标值避免窗口的抖动
若使用 pos() 函数获取 相对位置,在拖动过程 窗口 会出现抖动现象
globalPos()、globalX()、globalY() -- 这三个函数返回的是鼠标指针的全局坐标。
pos()、posF()、x()、y() -- 这四个函数返回的是鼠标指针在当前接收鼠标事件的窗口中的位置。
void DropWidget::mousePressEvent(QMouseEvent *event)
{
//只能是鼠标左键移动和改变大小
if(event->button() == Qt::LeftButton)
{
mouse_press = true;
}
//鼠标按下 点 的位置;
move_point = event->globalPos();
//鼠标按下 窗口初始位置;
widget_old_point = pos();
}
void DropWidget::mouseReleaseEvent(QMouseEvent *)
{
mouse_press = false;
}
void DropWidget::mouseMoveEvent(QMouseEvent *event)
{
//移动窗口
if(mouse_press)
{
QPoint move_pos = event->globalPos();
move(move_pos - move_point + widget_old_point);
}
}
本文介绍了如何在QT中为窗体添加阴影效果,并实现窗体的平滑拖动,重点在于利用globalPos()函数防止拖动时的窗口抖动问题。
835

被折叠的 条评论
为什么被折叠?



