0


【Qt】dialog设置无边框之后,模态窗口失效,无法阻止与其他窗口交互

在Qt中自定义一个dialog
并且在显示这个对话框的时候,想要指定他的位置:

我在这个dialog的构造函数中设置了他为模态窗口

this->setModal(true);

但是由于我的业务需求,我还设置了它为无边框窗口

this->setWindowFlags(Qt::WindowStaysOnTopHint | Qt::FramelessWindowHint );

但是你一旦设置了

FramelessWindowHint 

就会会导致模态的设置无效。(也就是弹窗出来以后,用户仍然可以与主界面交互)。

解决办法有两个:
1、你可以再加一个参数:

Qt::Dialog
    this->setWindowFlags(Qt::WindowStaysOnTopHint | Qt::FramelessWindowHint | Qt::Dialog);

这样就可以阻止用户与主界面交互了。
2、
你在实例化dialog的时候不要给他指定父对象,这样也可以实现模态。

但是这两个都会带来一个弊端:
本来我弹窗出来的时候我会给他指定一个位置,这个位置是靠

move

实现的

// 弹窗提示
TipsDialog* _tipDialog = new TipsDialog(_self);   //我指定了父对象
_tipDialog->setObjectName("ServerSync_tipDialog");
// 设置弹窗提示内容
QString message = "No server is selected and cannot be added";
_tipDialog->setTipsText(message);
// 设置弹窗位置  这个位置是相对与父对象的
_tipDialog->move((_self->width() - _tipDialog->width()) / 2,  + (_self->height() - _tipDialog->height()) / 2);

我这样可以让弹窗每次都弹到父对象的中间位置。

但是现在,解决了交互问题之后,无论是用方法1(加了Qt::Dialog)还是方法2(不指定父对象)都会导致这里位置设置失效。
他的

move

位置不会相对父对象,而是相对全局。

解决办法:
既然

move

设置的位置变成了全局位置,那就拿到父对象的全局位置,加进去计算,让其仍然相对与父对象居中。

// 弹窗提示
TipsDialog* _tipDialog = new TipsDialog(_self);
//_tipDialog->setParent(_self);
_tipDialog->setObjectName("ServerSync_tipDialog");
// 设置弹窗提示内容
QString message = "No server is selected and cannot be added";
_tipDialog->setTipsText(message);
// 设置弹窗位置
QPoint globalPos = _self->mapToGlobal(QPoint(0, 0));// 获取父对象的全局位置
_tipDialog->move(globalPos.x() + (_self->width() - _tipDialog->width()) / 2, globalPos.y() + (_self->height() - _tipDialog->height()) / 2);
_tipDialog->show();
标签: qt 交互 microsoft

本文转载自: https://blog.csdn.net/holly_Z_P_F/article/details/141428107
版权归原作者 1900_ 所有, 如有侵权,请联系我们删除。

“【Qt】dialog设置无边框之后,模态窗口失效,无法阻止与其他窗口交互”的评论:

还没有评论