Qt 視窗強制禁用系統陰影(自定義選單)

耿明岩發表於2024-11-08

解決方法

當只使用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視窗又不支援圓角,只能父視窗透明,子視窗圓角顯示:

最終效果:

相關文章