2

私は PyQt にかなり慣れていないので、PyQt4 と Python 2.7 で (とりわけ) いくつかのマイクロコントローラーの設定を制御する GUI を作成しています。設定のリストを簡単に入力して表示するために、どのコントローラーからのものかを QTableWidget に入れました。列はコントローラーで、行は設定です (すべてのコントローラーは単に相互に複製されていますが、すべての設定が表示されるわけではありません)。コントローラーからコントローラーまで同じ値である必要があります)。

私が抱えている問題は、ユーザーがセルを編集するときに、その新しい値を取得しようとすることです

value = self.Settings1Table.item(n, s).text()

しかし、それは入力中にセルに配置した値のみを取得し、キーボードから入力したばかりの値は取得しません。メソッドについて読んだことがありますcurrentText()が、私が理解していることから、それには各セルが独自のウィジェットである必要があり、それがどのように行われるかわかりません。

コード全体は非常に大きく、全体を投稿する必要はないと感じましたが、さらに多くのコードが必要な場合は、喜んで提供します。私が来ることを願っている助けをありがとう。

編集:これは、テーブル内の各項目を反復処理するメソッドです。現在の値を取得することになっていますが、現在は item.setText(str) を介して設定した値のみを返します(ユーザーが指定した値である必要があります)キーボード入力)

def ApplyAll1(self):
    if not self.CheckHealth():
        for s in xrange(NumOfSegs):
            n = 0
            for item in Settings1List:
                value = self.Settings1Table.item(n, s).text()
                print value
    else:
        self.MsgCntrField.setText("CONNECTION ERROR")

self.CheckHealth() は単なるエラーチェックです

4

1 に答える 1

2

最終更新日 2014 年 8 月 19 日 0 : 29

テーブル全体をループするので、イベントはあまり気にしません。「QtGui.QTableWidgetItem.setText」の代わりにキーボードでデータを変更する必要があるので、はい

OK、イベントを作成してからキーボードのみにすることもできますが、実装する必要がQtGui.QTableWidget.focusInEvent(self, eventQFocusEvent)ありますQtGui.QTableWidget.focusOutEvent(self, eventQFocusEvent). したがって、サンプル コードを参照してください。

import sys
from PyQt4 import QtGui, QtCore

class QCustomTableWidget (QtGui.QTableWidget):
    def __init__ (self, parent = None):
        super(QCustomTableWidget, self).__init__(parent)
        self.focusKeyboardOn = False
        # Setup row & column data
        listsVerticalHeaderItem = ['Device 1', 'Device 2', 'Device 3', 'Device 4', 'Device 5']
        self.setRowCount(len(listsVerticalHeaderItem))
        for index in range(self.rowCount()):
            self.setVerticalHeaderItem(index, QtGui.QTableWidgetItem(listsVerticalHeaderItem[index]))
        listsVerticalHeaderItem = ['Device 1', 'Device 2', 'Device 3', 'Device 4']
        self.setColumnCount(5)
        listsHorizontalHeaderItem = ['Option 1', 'Option 2']
        self.setColumnCount(len(listsHorizontalHeaderItem))
        for index in range(self.columnCount()):
            self.setHorizontalHeaderItem(index, QtGui.QTableWidgetItem(listsHorizontalHeaderItem[index]))

    def dataChanged (self, topLeftQModelIndex, bottomRightQModelIndex):
        row                  = topLeftQModelIndex.row()
        column               = topLeftQModelIndex.column()
        dataQTableWidgetItem = self.item(row, column)
        if (self.currentItem() == dataQTableWidgetItem) and (self.focusKeyboardOn == True):
            self.emit(QtCore.SIGNAL('currentKeyboardDataChanged'), row, column, dataQTableWidgetItem)
        self.emit(QtCore.SIGNAL('dataChanged'), row, column, dataQTableWidgetItem)
        QtGui.QTableWidget.dataChanged(self, topLeftQModelIndex, bottomRightQModelIndex)

    def focusInEvent (self, eventQFocusEvent):
        self.focusKeyboardOn = False
        QtGui.QTableWidget.focusInEvent(self, eventQFocusEvent)

    def focusOutEvent (self, eventQFocusEvent):
        self.focusKeyboardOn = True
        QtGui.QTableWidget.focusOutEvent(self, eventQFocusEvent)

class QCustomWidget (QtGui.QWidget):
    def __init__(self, parent = None):
        super(QCustomWidget, self).__init__(parent)
        self.myQCustomTableWidget = QCustomTableWidget(self)
        self.myQLabel = QtGui.QLabel('Track edited data', self)
        myQVBoxLayout = QtGui.QVBoxLayout()
        myQVBoxLayout.addWidget(self.myQLabel)
        myQVBoxLayout.addWidget(self.myQCustomTableWidget)
        self.setLayout(myQVBoxLayout)
        self.connect(self.myQCustomTableWidget, QtCore.SIGNAL('currentKeyboardDataChanged'), self.setTrackData)
        self.myQCustomTableWidget.setItem(0, 0, QtGui.QTableWidgetItem('Test'))
        self.myQCustomTableWidget.setItem(1, 1, QtGui.QTableWidgetItem('Work'))

    def setTrackData (self, row, column, dataQTableWidgetItem):
        self.myQLabel.setText('Last updated\nRow : %d, Column : %d, Data : %s' % (row + 1, column + 1, str(dataQTableWidgetItem.text())))

if __name__ == '__main__':
    myQApplication = QtGui.QApplication(sys.argv)
    myQCustomWidget = QCustomWidget()
    myQCustomWidget.show()
    sys.exit(myQApplication.exec_())

注 : バグが発生するコードが 1 つあります。ただし、厳密な場合は、独自のウィジェットを作成し、独自のアイテム デリゲートを設定することをお勧めします。(しかし、非常にハードコア...)


あなたのセルのデータが何であるかわかりません。(これは別のカスタムQWidgetか、通常のデータですQTableWidgetItem)

とにかく、ユーザーがセルを編集すると、このメソッドで新しい値を取得しようとしますQAbstractItemView.dataChanged (self, QModelIndex topLeft, QModelIndex bottomRight)。このメソッドは、編集されたデータの位置を返し、 index を使用してデータを取得しますQTableWidgetItem QTableWidget.item (self, int row, int column)。(それはあなたの言う質問です)しかし、この作品は編集が近いだけです(編集中ではありません)。

例;

import sys
from PyQt4 import QtGui, QtCore

class QCustomTableWidget (QtGui.QTableWidget):
    def __init__ (self, parent = None):
        super(QCustomTableWidget, self).__init__(parent)
        # Setup row & column data
        listsVerticalHeaderItem = ['Device 1', 'Device 2', 'Device 3', 'Device 4', 'Device 5']
        self.setRowCount(len(listsVerticalHeaderItem))
        for index in range(self.rowCount()):
            self.setVerticalHeaderItem(index, QtGui.QTableWidgetItem(listsVerticalHeaderItem[index]))
        listsVerticalHeaderItem = ['Device 1', 'Device 2', 'Device 3', 'Device 4']
        self.setColumnCount(5)
        listsHorizontalHeaderItem = ['Option 1', 'Option 2']
        self.setColumnCount(len(listsHorizontalHeaderItem))
        for index in range(self.columnCount()):
            self.setHorizontalHeaderItem(index, QtGui.QTableWidgetItem(listsHorizontalHeaderItem[index]))

    def dataChanged (self, topLeftQModelIndex, bottomRightQModelIndex):
        row                  = topLeftQModelIndex.row()
        column               = topLeftQModelIndex.column()
        dataQTableWidgetItem = self.item(row, column)
        print '###### Data Changed  ######'
        print 'row    :', row + 1
        print 'column :', column + 1
        print 'data   :', dataQTableWidgetItem.text()
        self.emit(QtCore.SIGNAL('dataChanged'), row, column, dataQTableWidgetItem)
        QtGui.QTableWidget.dataChanged(self, topLeftQModelIndex, bottomRightQModelIndex)

class QCustomWidget (QtGui.QWidget):
    def __init__(self, parent = None):
        super(QCustomWidget, self).__init__(parent)
        self.myQCustomTableWidget = QCustomTableWidget(self)
        self.myQLabel = QtGui.QLabel('Track edited data', self)
        myQVBoxLayout = QtGui.QVBoxLayout()
        myQVBoxLayout.addWidget(self.myQLabel)
        myQVBoxLayout.addWidget(self.myQCustomTableWidget)
        self.setLayout(myQVBoxLayout)
        self.connect(self.myQCustomTableWidget, QtCore.SIGNAL('dataChanged'), self.setTrackData)

    def setTrackData (self, row, column, dataQTableWidgetItem):
        self.myQLabel.setText('Last updated\nRow : %d, Column : %d, Data : %s' % (row + 1, column + 1, str(dataQTableWidgetItem.text())))

if __name__ == '__main__':
    myQApplication = QtGui.QApplication(sys.argv)
    myQCustomWidget = QCustomWidget()
    myQCustomWidget.show()
    sys.exit(myQApplication.exec_())

QAbstractItemView.dataChanged (self, QModelIndex topLeft, QModelIndex bottomRight)参照: http://pyqt.sourceforge.net/Docs/PyQt4/qabstractitemview.html#dataChanged


よろしく、

于 2014-08-17T18:50:49.037 に答える