【问题标题】:Reset focus in tabified dock widgets在选项卡式停靠小部件中重置焦点
【发布时间】:2018-05-02 11:51:55
【问题描述】:

目前我在标签化 QDockWidgets 的焦点上遇到问题。 使用两个选项卡式 QDockWidget 处理这个小示例:

from PyQt5.QtWidgets import QApplication, QMainWindow, QDockWidget, QTextEdit
from PyQt5.Qt import Qt

app = QApplication( [] )
main = QMainWindow(None, Qt.Window)
main.show()

dock1 = QDockWidget( "D1", main )
dock1.setWidget( QTextEdit( dock1 ) )
main.addDockWidget( Qt.TopDockWidgetArea, dock1 )

dock2 = QDockWidget( "D2", main )
dock2.setWidget( QTextEdit( dock2 ) )
main.tabifyDockWidget( dock1, dock2 )

exit( app.exec() )

我体验到QTextEdits 在切换到选项卡小部件的另一个选项卡时不会失去焦点。

  1. 在其中一个字段中写入文本
  2. 点击QTabBar上的另一个Tab
  3. 继续键盘输入

你写的第二个文本仍然是第一个小部件的焦点。


所以,总的来说:
有没有办法让标签化小部件失去焦点,无论它是QTextEdit 还是其他一些小部件(甚至可能具有复杂的子布局结构)?

我在QDockWidget 上尝试了clearFocus(),但如果 QDockWidget 本身包含焦点(不是它的子元素),这似乎可行。
在之前使用setFocus() 似乎也不是一个好的选择,因为小部件(或其子部件)可能不会在每种情况下都包含焦点。因此,从其他小部件中窃取它是不合适的。


我认为最好的反应锚是:

如果你能找到动态创建的 QTabBar:

【问题讨论】:

    标签: python pyqt focus pyqt5 qdockwidget


    【解决方案1】:

    一个非常简单的方法是检查当前focus widget 是否是QDockWidget 的后代,只要选项卡更改,然后在必要时重置焦点:

    from PyQt5.QtWidgets import QApplication, QMainWindow, QDockWidget, QTextEdit
    from PyQt5.QtCore import Qt
    
    class DockWidget(QDockWidget):
        def __init__(self, *args, **kwargs):
            super().__init__(*args, **kwargs)
            self.setWidget(QTextEdit(self))
            self.visibilityChanged.connect(self.updateFocus)
    
        def updateFocus(self, visible):
            if visible:
                widget = QApplication.instance().focusWidget()
                while widget is not None:
                    if isinstance(widget, QDockWidget):
                        widget = None
                    elif widget.parentWidget() is not None:
                        widget = widget.parentWidget()
                    else:
                        break
                if widget is None:
                    self.setFocus()
                    self.focusNextChild()
    
    app = QApplication([''])
    main = QMainWindow()
    main.setCentralWidget(QTextEdit(main))
    
    dock1 = DockWidget("D1", main)
    main.addDockWidget(Qt.TopDockWidgetArea, dock1)
    
    dock2 = DockWidget("D2", main)
    main.tabifyDockWidget(dock1, dock2)
    
    main.show()
    app.exec()
    

    【讨论】:

    • 好的,找到了一个小例子:有两组标签的dockwidgets,然后它可能会从另一组中窃取焦点。修复:在if isinstance(widget, QDockWidget): 行中添加and self in widget.parent().tabifiedDockWidgets(widget):。这将检查聚焦的 QDockWidget 是否与当前选定的 QDockWidget 一起标记。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-06-06
    • 1970-01-01
    • 1970-01-01
    • 2016-05-09
    • 1970-01-01
    • 2021-12-07
    • 1970-01-01
    相关资源
    最近更新 更多