本篇内容主要讲解“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遮罩层窗体怎么实现”有了更深的了解,不妨来实际操作一番吧!这里是亿速云网站,更多相关内容可以进入相关频道进行查询,关注我们,继续学习!
亿速云「云服务器」,即开即用、新一代英特尔至强铂金CPU、三副本存储NVMe SSD云盘,价格低至29元/月。点击查看>>
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。
原文链接:https://my.oschina.net/feiyangqingyun/blog/4297837