在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();
版权归原作者 1900_ 所有, 如有侵权,请联系我们删除。