2010-05-07 95 views
1

我正在调试用C++/Qt4编写的某些应用程序。在Linux上,它有一些问题,对于某些窗口管理器(gnome-wm/metacity),主窗口(基于QDialog)是在后台创建的(不会引发)。我设法重新创建使用PyQt4的和以下代码方案:调用QDialog上的activateWindow将窗口发送到背景

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?如果有某种原因,那么聚焦问题有什么好的解决方法?

回答

0

这个问题最可能是由Qt中的一个错误引起的。我无法在最近的Qt版本中重现相同的行为。最初转载于Fedora 13上,Fedora 14正常。

1

我也是,见过这种行为。

根据the documentation

在X11,结果取决于窗口管理器

看来,侏儒正在采取相同立场,微软的Windows中不允许应用程序中断什么用户目前正在另一个应用程序(在这种情况下为终端)中执行操作。

+0

嗯,我会明白,如果我会忽略对activateWindow的调用,因为我的窗口不在顶部,但它有效地完全相反(请参阅我的关于删除调用的注释)。我开始认为这是gnome-wm或Qt4中的一个bug – Stan 2010-05-11 13:42:36