您好,登錄后才能下訂單哦!
本篇內容主要講解“Qt遮罩層窗體怎么實現”,感興趣的朋友不妨來看看。本文介紹的方法操作簡單快捷,實用性強。下面就讓小編來帶大家學習“Qt遮罩層窗體怎么實現”吧!
在有些項目中,需要在彈框的窗體背后遮罩原有主窗體,使得突出顯示彈窗窗體,突然想到之前寫過一個全局截屏的東東,原理一致,拿來改改。只需要引入一個頭文件和實現文件,然后在主窗體中設置下需要遮罩的主窗體和可能彈窗窗體的類名即可,就是如此簡單。可以支持多個窗體列表。 原理很簡單,先安裝事件過濾器,攔截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); }
到此,相信大家對“Qt遮罩層窗體怎么實現”有了更深的了解,不妨來實際操作一番吧!這里是億速云網站,更多相關內容可以進入相關頻道進行查詢,關注我們,繼續學習!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。