2017-02-14 102 views
0

請考慮以下代碼。我在BeagleBone上運行它(libqt5widgets5:armhf 5.7.1 + dfsg-3 + b1)。它會觸發FocusInEvent事件。當我在行(***)中用QWidget替換QDialog時,它停止工作。爲什麼?QWidget沒有焦點事件

對於不同的PyQt5安裝(我使用Cygwin來檢查),這是不可重現的。

[1]這可能會或可能不會涉及到,:focus don't work in PyQt (QT 5.7) [2]在C++中同樣的事情也不起作用,https://github.com/leshikus/qt-test

#!/usr/bin/python3 
# -*- coding: utf-8 -*- 

import sys 
from PyQt5.QtWidgets import QApplication, QWidget, QSlider, QCheckBox, QVBoxLayout, QMainWindow, QDialog 
from PyQt5.QtCore import Qt, QEvent 


class MyWidget(QSlider): 
    def __init__(self): 
     super().__init__() 

    def focusInEvent(self, event): 
     super().focusInEvent(event) 
     print('focusInEvent') 

    def focusOutEvent(self, event): 
     super().focusOutEvent(event) 
     print('focusOutEvent') 

    def eventFilter(self, source, event): 
     print("eventFilter", event.type(), source) 
     return super().eventFilter(source, event) 


if __name__ == '__main__': 

    app = QApplication(sys.argv) 

    w = QDialog() # got replaced with QWidget (***) 
    w.resize(300, 200) 
    w.move(30, 30) 

    layout = QVBoxLayout() 
    layout.setContentsMargins(0, 0, 0, 0) 
    layout.setSpacing(0) 

    s = MyWidget() 
    layout.addWidget(s) 
    w.setLayout(layout) 

    s.installEventFilter(s) 
    s.setFocus() 
    w.show() 

    sys.exit(app.exec_()) 
+0

如果你認爲你已經發現了一個bug /不好的特性,你需要[做出正確的bug報告(https://bugreports.qt.io/secure/ Dashboard.jspa)。 – ekhumoro

回答

1

您需要通過調用setFocusPolicy(Qt::FocusPolicy policy),讓您的QWidget接受焦點事件

查看C++ API瞭解關於重點政策的更多信息。

Python特定的文檔可供PyQt4

+0

添加'w.setFocusPolicy(Qt.StrongFocus)'沒有幫助 – dataved

+0

嘗試在MyWidget的初始化程序中調用'self.setFocusPolicy(Qt.StrongFocus)'。 – gortsu

+0

也沒有運氣。請注意,該錯誤在不同平臺上不可重現。 – dataved