c++ - 在拖动/调整窗口大小时在窗口上调用 isActive() 时,返回 false。 (X11, Qt 5.4.0)

标签 c++ linux qt pyqt x11

我在 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/

相关文章:

qt - 避免应用程序激活并在单击其上的按钮时聚焦 - Windows API 或 Qt

c++ - Qt/C++ 从 QPolygonF 继承为 QList 项

c++ - 在字符串 vector 中创建 20,000 个 MAC 地址

c++ - 用于 win32、linux、mac 的 POSIX C 包装器

c++ - "Windows doesn' t 支持正确的动态链接是什么意思?”

linux - 将 -1 作为文件描述符传递给 mmap

c++ - 在 Qt 和 C++ [QMediaPlayer] 中更改 mp3 速度

c++ - 为什么会出现链接器错误?

c++ - 检查 cin 输入流产生一个整数

c++ - 使用 Boost 库的 C++ 中的线程池