我在 Linux (X11) 上使用 Qt 5.4.0,我需要确定我的窗口是否处于事件状态。因此,我编写了示例代码,如下所示。如果该代码在 Windows 上编译,则仅当窗口未真正激活时,它才会在控制台中记录“false”。但是在 linux (X11) 上,当我开始拖动或调整窗口大小时,它也会记录“false”。为什么会发生这种情况以及如何在 Linux 上解决这个问题?我想知道,什么时候我的窗口真正处于非事件状态,什么时候处于事件状态,但正在被拖动/调整大小。
代码片段(C++):
void MainWindow::changeEvent(QEvent *e) {
if (e->type() == QEvent::ActivationChange) {
if (this->isActiveWindow()) {
std::cout << "True" << std::endl;
} else {
std::cout << "False" << std::endl;
}
}
}
相同的代码,在 PyQt5 上:
import sys
from PyQt5.QtCore import Qt, QEvent
from PyQt5.QtWidgets import QWidget, QApplication
class TransparentWidget(QWidget):
def __init__(self):
super(TransparentWidget, self).__init__()
def changeEvent(self, e):
if e.type() == QEvent.ActivationChange:
print(self.isActiveWindow())
if __name__ == '__main__':
app = QApplication(sys.argv)
transparent_widget = TransparentWidget()
transparent_widget.show()
app.exec_()
最佳答案
它可能注册为“false”,因为在 X 上您看到的窗口实际上是两个窗口:您绘制内容的窗口和一个稍大的窗口,它是您的父窗口并包含边框。
原因是 X11 没有带有关闭/最大/最小按钮、标题栏、漂亮的渐变颜色、圆形边框等的“装饰边框”的概念(原生 X11 窗口可以有边框,但仅作为纯色或纹理)。这些控件由您的窗口管理器提供。如果您创建一个窗口,窗口管理器会创建一个比您的稍大的额外 X11 窗口,并将您的窗口作为子窗口放置在这个新窗口上。从那时起,这两个窗口就紧密地联系在一起:调整您的窗口大小将调整父窗口的大小,反之亦然。
这一切都由窗口管理器处理。例如,如果您想调整窗口大小并单击边框,则单击不会进入您的窗口,而是进入窗口管理器,然后由窗口管理器确定点击的位置并决定如何处理它。所以在那一刻你自己的窗口不再事件,这解释了为什么 isActiveWindow() 返回 false。
对于 Microsoft Windows,边框是窗口本身不可或缺的一部分,因此它保持“事件”状态。
无论如何,要确定您的窗口是否处于“事件”状态,您应该使用 QFocusEvent。通过查看 gotFocus() 和 lostFocus() 值,您应该能够跟踪窗口何时处于事件状态。
关于c++ - 在拖动/调整窗口大小时在窗口上调用 isActive() 时,返回 false。 (X11, Qt 5.4.0),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29141439/