解决方法
当只使用Qt::FramelessWindowHint时,不会显示系统阴影,因为自定义菜单一般都会添加Qt::Popup,添加Qt::Popup后系统会默认添加阴影效果。
在添加Qt::Popup后,继续添加Qt::NoDropShadowWindowHint枚举解决。
最小复现代码:
QDialog *dia = new QDialog();dia->setWindowFlags(Qt::FramelessWindowHint|Qt::Popup);setAttribute(Qt::WA_TranslucentBackground);setAttribute(Qt::WA_StyledBackground);setAttribute(Qt::WA_DeleteOnClose);dia->setStyleSheet("background: white;");dia->show();
发现窗口四周有阴影,当添加Qt::NoDropShadowWindowHint后解决:
QDialog *dia = new QDialog();dia->setAttribute(Qt::WA_TranslucentBackground);dia->setAttribute(Qt::WA_StyledBackground);dia->setAttribute(Qt::WA_DeleteOnClose);dia->setWindowFlags(Qt::FramelessWindowHint|Qt::Popup|Qt::NoDropShadowWindowHint);QWidget *wid = new QWidget();wid->setStyleSheet("background: red;");QHBoxLayout *layout = new QHBoxLayout();layout->addWidget(wid);layout->setMargin(15);dia->setLayout(layout);dia->setGeometry(this->pos().x(), this->pos().y(), 100, 200);dia->show();
问题背景
Windows 默认情况下开启阴影,这就导致使用Qt做的一些透明背景自定义菜单显示不正常(例如椭圆角的菜单):
没设置系统阴影时显示正常:
设置系统阴影后:
主要原因是由于菜单四周是圆角,Windows窗口又不支持圆角,只能父窗口透明,子窗口圆角显示:
最终效果: