调用QDialog的activateWindow将窗口置于后台

1 投票
2 回答
1115 浏览
提问于 2025-04-15 22:27

我正在调试一个用C++/Qt4写的应用程序。在Linux上,它在某些窗口管理器(比如gnome-wm/metacity)下有问题,主窗口(基于QDialog)会在后台创建(也就是没有被提升到最前面)。我用PyQt4重现了这个情况,以下是相关代码:

from PyQt4.QtCore import *
from PyQt4.QtGui import *
import sys

class PinDialog(QDialog):

    def showEvent(self, event):
        QDialog.showEvent(self, event)
        self.raise_()
        self.activateWindow()

if __name__ == "__main__":
    app = QApplication(sys.argv)
    widget = PinDialog()
    app.setActiveWindow(widget)
    widget.exec_()
    sys.exit(0)

如果我去掉

self.activateWindow() 

这个部分,应用程序就能正常工作了。这似乎不太对,因为关于activateWindow的文档并没有说明在什么情况下会出现这样的情况。

我的问题是:在showEvent中使用activateWindow有没有什么理由?如果有理由的话,解决聚焦问题的好方法是什么?

2 个回答

1

我也遇到过这种情况。

根据文档的说法:

在X11系统上,结果取决于窗口管理器。

看起来,Gnome的做法和微软Windows很像,都不允许一个应用程序打断用户在另一个应用程序(在这个例子中是终端)中正在进行的操作。

0

这个问题很可能是因为Qt里面的一个错误导致的。我在最近的Qt版本中无法再出现同样的情况。最开始是在Fedora 13上出现的,而在Fedora 14上就没问题了。

撰写回答