一、前言
在有些項目中,需要在彈框的窗體背後遮罩原有主窗體,使得突出顯示彈窗窗體,突然想到之前寫過一個全局截屏的東東,原理一緻,拿來改改。隻需要引入一個頭檔案和實作檔案,然後在主窗體中設定下需要遮罩的主窗體和可能彈窗窗體的類名即可,就是如此簡單。可以支援多個窗體清單。
原理很簡單,先安裝事件過濾器,攔截QEvent::Show事件,拿到目前窗體,如果在需要遮罩的窗體清單中,則彈出半透明的窗體,大小和彈出的窗體大小一緻,然後在激活目前彈出的窗體。
二、代碼思路
//使用方法
//第一步,設定需要遮罩的父窗體
MaskWidget::Instance()->setMainWidget(this);
//第二步,設定哪些彈窗窗體需要被遮罩
QStringList dialogNames;
dialogNames << "frm1" << "frm2";
MaskWidget::Instance()->setDialogNames(dialogNames);
//核心代碼
void MaskWidget::setDialogNames(const QStringList &dialogNames)
{
if (this->dialogNames != dialogNames) {
this->dialogNames = dialogNames;
}
}
void MaskWidget::setOpacity(double opacity)
{
this->setWindowOpacity(opacity);
}
void MaskWidget::setBgColor(const QColor &bgColor)
{
QPalette palette = this->palette();
palette.setBrush(QPalette::Background, bgColor);
this->setPalette(palette);
}
void MaskWidget::showEvent(QShowEvent *)
{
if (mainWidget != 0) {
this->setGeometry(mainWidget->geometry());
}
}
bool MaskWidget::eventFilter(QObject *obj, QEvent *event)
{
if (event->type() == QEvent::Show) {
if (dialogNames.contains(obj->objectName())) {
this->show();
this->activateWindow();
QWidget *w = (QWidget *)obj;
w->activateWindow();
}
} else if (event->type() == QEvent::Hide) {
if (dialogNames.contains(obj->objectName())) {
this->hide();
}
} else if (event->type() == QEvent::WindowActivate) {
//當主窗體激活時,同時激活遮罩層
if (mainWidget != 0) {
if (obj->objectName() == mainWidget->objectName()) {
if (this->isVisible()) {
this->activateWindow();
}
}
}
}
return QObject::eventFilter(obj, event);
}
三、效果圖

四、開源首頁
以上作品完整源碼下載下傳都在開源首頁,會持續不斷更新作品數量和品質,歡迎各位關注。