Сбросить фокус в закрепленных виджетах - PullRequest
0 голосов
/ 02 мая 2018

В настоящее время у меня проблемы с фокусировкой табулированных QDockWidgets. Работа с этим небольшим примером с использованием двух таблиц QDockWidgets:

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
  3. продолжить ввод с клавиатуры

Второй текст, который вы написали, все еще был в фокусе первого виджета.


Итак, в целом:
Есть ли способ потерять фокус виджетов, помеченных в виде таблицы, независимо от того, является ли это QTextEdit или каким-либо другим виджетом (ями) (возможно, даже со сложной структурой дочернего макета)?

Я попытался clearFocus() на QDockWidget, но, похоже, это работает, если QDockWidget itselfe содержит фокус (не дочерний).
Использование setFocus() ранее также не кажется хорошим вариантом, поскольку виджет (или его дочерние элементы) может не содержать фокус в каждом случае. Так что было бы неуместно украсть его у какого-нибудь другого виджета.


Я думаю, что лучшие анкеры, на которые можно было бы реагировать, были бы:

и если вы захотите найти динамически создаваемый QTabBar:

1 Ответ

0 голосов
/ 02 мая 2018

Один довольно простой способ сделать это - проверить, является ли текущий виджет фокуса потомком 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()
...