解決方法
當只使用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視窗又不支援圓角,只能父視窗透明,子視窗圓角顯示:
最終效果: