前の最後のフォーカスを持っていたQWidgetの決定:私はQtアプリケーションに次の機能を実装したいボタンを押し
- ユーザーは、それぞれが含む、1以上の「入力」ウィジェット(
InputWidget
クラスのインスタンス)を開き、QLineEdit
ウィジェット - ユーザーが「ヘルパー]ダイアログを開きます
- ユーザーは
- ユーザーは、「挿入」
QPushButton
「ヘルパー」ダイアログ でを押す「ヘルパー」ダイアログで値を選択します「ヘルパー」ダイアログから
- 選択した値が挿入 『ボタンだから、
を押された、基本的に、私が欲しいものである入力『前の最後のフォーカスを持っていたダイアログ』」というのQLineEdit
に挿入されています』次のスクリーンショットでユーザーが「挿入」をクリックすると、フォーカスされた入力ダイアログに文字列「Apple」が表示されるはずです。以下のコード例は、作業の種類を示していますが、文字列は2番目の文字列に挿入されています(通常は下を参照)。
ここだ、このセットアップを作成するコードの例です:
from PyQt5.QtWidgets import (QApplication, QWidget, QHBoxLayout,
QLineEdit, QLabel, QPushButton, QComboBox)
import sys
# this is the missing bit
def determineWhichWidgetHadLastFocus():
for widget in QApplication.instance().topLevelWidgets():
if isinstance(widget, InputWidget):
# do something wonderful to determine whether this widget
# is the one that had last focus
wonderful = True
if wonderful:
return widget
return None
class BaseWidget(QWidget):
""" Base widget type """
def __init__(self, name):
super(BaseWidget, self).__init__()
self.setWindowTitle(name)
self.setupUi()
self.show()
def setupUi(self):
pass
class InputWidget(BaseWidget):
""" InputWidget contains a QLabel and a QLineEdit widget """
def setupUi(self):
self.label = QLabel("Input string:")
self.edit = QLineEdit()
layout = QHBoxLayout(self)
layout.addWidget(self.label)
layout.addWidget(self.edit)
class HelperWidget(BaseWidget):
""" HelperWidget contains a QLineEdit and a QPushButton widget. Pressing
the button inserts the content of the edit widget into the edit widget of
the last activated InputWidget """
def setupUi(self):
self.combo = QComboBox()
self.combo.addItems(["Apple", "Pear", "Banana"])
self.button = QPushButton("Insert")
self.button.clicked.connect(self.insertString)
layout = QHBoxLayout(self)
layout.addWidget(self.combo)
layout.addWidget(self.button)
def insertString(self):
widget = determineWhichWidgetHadLastFocus()
if widget:
widget.edit.insert(self.combo.currentText())
def main():
app = QApplication(sys.argv)
diag1 = InputWidget("Input dialog")
diag2 = InputWidget("Another input")
helper = HelperWidget("Helper")
app.exec_()
if __name__ == "__main__":
main()
欠けている部分がdetermineWhichWidgetHadLastFocus()
機能です。
この関数は、「入力」がフォーカスを保持する最後のものであるかどうかを判断できるようにすばらしいやり方をすることになっています。現在のところ、トップレベルのウィジェットのリストをQApplication
から検索していますが、トップレベルのウィジェットの順序はアクティブ化の順序を反映していません(通常、作成の順番であるとは限りません)。
私の頭に浮かべた1つのアイデアは、FocusIn
イベントを追跡するイベントフィルタをインストールすることでした。これは私の例ではInputWidget
クラスにとっては簡単ですが、実際のアプリケーションでは多くのQLineEdit
、QTextEdit
、下位クラスのすべてがあまりにもうまく機能しない可能性があります。私はむしろそのように行かないだろう。
他のアイデアはありますか?