在项目中常有需求,需要将弹出的窗口进行置顶(比如设置窗口),如果是在同一个进程内的窗口那我们可以使用QDialog来做,但是如果是启动外部其他进程呢?这里我们就讲一下后面这种情况如何处理。
一下操作都是在需要制定的那个窗口程序中的操作。
1.在构造函数中设置窗口的制定属性
/** 在X11的桌面环境中需要Qt::X11BypassWindowManagerHint ,Windows下无需此属性 */
setWindowFlags(windowFlags()| Qt::WindowStaysOnTopHint | Qt::X11BypassWindowManagerHint);
2.如果窗口中有输入框等输入控件,那么有可能会出现无法输入获取焦点,所以需要如下操作
void PSetting::showEvent(QShowEvent *event)
{
setWindowFlags(windowFlags()| Qt::WindowStaysOnTopHint | Qt::X11BypassWindowManagerHint);
/** 激活当前窗口 */
activateWindow();
}
3.当鼠标点击该窗口之外的其他窗口时,又可能导致无法获取焦点,所以我们还需要在进一步处理一下
void PSetting::enterEvent(QEvent *event)
{
setWindowFlags(windowFlags()| Qt::WindowStaysOnTopHint | Qt::X11BypassWindowManagerHint);
activateWindow();
}
4.当我们需要在该置顶窗口再进行弹出窗口的时候就需要特别注意了,弹出窗口也需要跟此窗口做一样的操作,例如
void PSetting::on_pushButton_4_clicked()
{
QMessageBox box(QMessageBox::Information,"Set","保存成功",QMessageBox::NoButton,this);
box.setStandardButtons (QMessageBox::Ok);
box.setButtonText (QMessageBox::Ok,QString("确 定"));
/** Message只有按钮所以只做了置顶操作 */
box.setWindowFlags(box.windowFlags()| Qt::WindowStaysOnTopHint | Qt::X11BypassWindowManagerHint);
box.exec();
}
到此就是我自己的实现,如果有更好的方法或不同的请留言告诉我,我也去学习一下