1

最後に、私が解決しようとしている問題は、誰かがフィールドを編集してQTableWidgetから [OK] をクリックしてから、Enter キーを押すか、テーブル セルからフォーカスを移動することです。

「コミット」されていないため、デフォルトの動作はこのセルを無視するようです。

簡単な例を次に示します。

#!/usr/bin/env python

import sys
import pprint
from PyQt4 import QtCore,QtGui

class Dialog(QtGui.QDialog):
    def __init__(self,parent=None):
        super(Dialog,self).__init__(parent)

        self.table = QtGui.QTableWidget(5,2)

        button_box = QtGui.QDialogButtonBox(QtGui.QDialogButtonBox.Ok|QtGui.QDialogButtonBox.Cancel)
        button_box.accepted.connect(self.accept)
        button_box.rejected.connect(self.reject)

        layout = QtGui.QVBoxLayout()

        layout.addWidget(self.table)
        layout.addWidget(button_box)

        self.setLayout(layout)

    def accept(self):
        ret = {}
        for i in range(self.table.rowCount()):  
            k = self.table.item(i,0)
            v = self.table.item(i,1)
            if not k:
                continue
            if k.text().isEmpty():
                continue
            if not v:
                v = QtGui.QTableWidgetItem("")
            ret[str(k.text())] = str(v.text())

        pprint.pprint(ret)


def main():
    app = QtGui.QApplication(sys.argv)

    main = Dialog()
    main.show()
    sys.exit(app.exec_())

if __name__ == "__main__":
    main()

この例でaは、最初のセルに入力するbと、2 番目のセルに入力されます。最初にエンターキーを押したり、フォーカスを変更したりせずに「OK」をクリックすると、次のように表示されます。

{'a': ''}

見たいとき:

{'a': 'b'}

私が持っていたアイデアは、セルを QLineEdit のように扱い、textChanged を使用してユーザーがいつ入力したかを確認し、次に、キーストロークごとにセルの setItem を舞台裏で確認することでした-セル内のデータは常に最新。QStyledItemDelegateQLineEdit (textChanged シグナルを持つ) のように編集できるように (以下)を使用してこれを試みました。デリゲート自体から変更を出力できるため、これはある程度機能しますが、textChanged シグナルが有用な場所で取得できないようです (つまり、ダイアログはこれを認識しないため、テーブル内の setItem)。

class LineEditDelegate(QtGui.QStyledItemDelegate):
    textChanged = QtCore.pyqtSignal(str)
    def createEditor(self, parent, option, index):
        editor = QtGui.QLineEdit(parent)
        editor.textChanged.connect(self.textChanged)
        return editor

しかし、それはうまくいきません。

また、QLineEdit の textChanged が発生したときに commitData シグナルを発行しようとしましたが、これも役に立ちませんでした。

セルがまだ編集されている間にセルの内容を取得する方法はありますか?

4

0 に答える 0