Qt 音乐播放器:实现点击窗体外的地方该窗口自动关闭
最近在模仿网易云播放器的时候遇到这个问题:点击"播放列表"弹出音乐列表窗体,点击该窗体的其他的地方。该窗口自动关闭,如下所示:
(ps:录屏的时候,鼠标显示不出来,尴尬!)
为此,记录实现该种效果的方法:
//创建该对象的时候,设置坐标和大小都为0
m_pMusicPlayListWidget = new MusicPlayListWidget(this);
m_pMusicPlayListWidget->setGeometry(0,0,0,0);
点击按钮进入槽函数:
这里设置窗体的坐标点为(0,0)大小和主窗体的大小一致。为了方便后面确定点击其他位置关闭该窗体。
//显示播放列表窗体,这里设置坐标点为(0,0)
void QXMusicPlay::slot_showPlayList(bool flag)
{
Q_UNUSED(flag);
m_pMusicPlayListWidget->show();
m_pMusicPlayListWidget->setGeometry(0,0,1020,670);
}
在窗体对象中。重写paintEvent()函数和mousePressEvent()函数实现.
//重绘事件
void MusicPlayListWidget::paintEvent(QPaintEvent *event)
{
Q_UNUSED(event);
QPainter painter(this);
painter.setRenderHint(QPainter::SmoothPixmapTransform);
painter.setRenderHint(QPainter::Antialiasing);
QColor color(52,53,44);
// color.setAlphaF(0.8);//设置透明度
painter.save();
painter.setPen(Qt::NoPen);
painter.setBrush(color);
QRectF rect=QRectF(440,140,580,470);//绘制矩形,也就是我们所需要窗体的大小
painter.drawRoundedRect(rect,10,10);
painter.restore();
}
//重写鼠标点击函数,实现点击其他地方光比该窗体
void MusicPlayListWidget::mousePressEvent(QMouseEvent *event)
{
if(event->pos().x()<440)
{
this->hide();
setGeometry(0,0,0,0);
}
if((event->pos().y()>610)||(event->pos().y()<140))
{
this->hide();
setGeometry(0,0,0,0);
}
}