2017-12-19 15 views
1

2つの接続された信号を持つPyQt5 QTableWidgetがあります。 1つの信号は、ユーザーがテーブル内のセルの編集を開始すると、画面にテキストを表示して出力します。もう1つは、ユーザーが編集を終了したときにテキストを焼き付けて印刷することです。QTableWidget:セル編集の開始を検出する信号

後者は、信号をcellChanged信号に接続することで動作します。ただし、ユーザーがテーブル内のセルの編集を開始すると、cellActivated信号は発生しません。

明確にする:セルの編集が開始されたとき(つまり、ユーザーがセルに入力できることを示す点滅カーソルが表のセルに表示されているとき)にキャッチオール信号を欲しい。したがって、doubleClick信号に接続することはそのトリックを行いません。しかし、ユーザーがEnterキーを押して編集を開始したときには、ただ起動するだけです。ここで

が私のコードです:

from PyQt5 import QtCore, QtWidgets 

class Ui_MainWindow(object): 
    def setupUi(self, MainWindow): 
     MainWindow.setObjectName("MainWindow") 
     MainWindow.resize(790, 472) 
     self.centralwidget = QtWidgets.QWidget(MainWindow) 
     self.centralwidget.setObjectName("centralwidget") 
     self.tbwMain = QtWidgets.QTabWidget(self.centralwidget) 
     self.tbwMain.setGeometry(QtCore.QRect(0, 0, 801, 451)) 
     self.tbwMain.setObjectName("tbwMain") 
     self.tabBoxes = QtWidgets.QWidget() 
     self.tabBoxes.setObjectName("tabBoxes") 
     self.horizontalLayoutWidget = QtWidgets.QWidget(self.tabBoxes) 
     self.horizontalLayoutWidget.setGeometry(QtCore.QRect(0, 0, 791, 421)) 
     self.horizontalLayoutWidget.setObjectName("horizontalLayoutWidget") 
     self.horizontalLayout = QtWidgets.QHBoxLayout(self.horizontalLayoutWidget) 
     self.horizontalLayout.setContentsMargins(0, 0, 0, 0) 
     self.horizontalLayout.setObjectName("horizontalLayout") 
     spacerItem = QtWidgets.QSpacerItem(220, 40, QtWidgets.QSizePolicy.Minimum, QtWidgets.QSizePolicy.Expanding) 
     self.horizontalLayout.addItem(spacerItem) 
     self.tblBoxes = QtWidgets.QTableWidget(self.horizontalLayoutWidget) 
     self.tblBoxes.setVerticalScrollBarPolicy(QtCore.Qt.ScrollBarAlwaysOn) 
     self.tblBoxes.setVerticalScrollMode(QtWidgets.QAbstractItemView.ScrollPerPixel) 
     self.tblBoxes.setRowCount(1) 
     self.tblBoxes.setObjectName("tblBoxes") 
     self.tblBoxes.setColumnCount(3) 
     item = QtWidgets.QTableWidgetItem() 
     self.tblBoxes.setHorizontalHeaderItem(0, item) 
     item = QtWidgets.QTableWidgetItem() 
     self.tblBoxes.setHorizontalHeaderItem(1, item) 
     item = QtWidgets.QTableWidgetItem() 
     self.tblBoxes.setHorizontalHeaderItem(2, item) 
     item = QtWidgets.QTableWidgetItem() 
     item.setTextAlignment(QtCore.Qt.AlignCenter) 
     self.tblBoxes.setItem(0, 0, item) 
     item = QtWidgets.QTableWidgetItem() 
     item.setTextAlignment(QtCore.Qt.AlignCenter) 
     self.tblBoxes.setItem(0, 1, item) 
     item = QtWidgets.QTableWidgetItem() 
     item.setTextAlignment(QtCore.Qt.AlignCenter) 
     self.tblBoxes.setItem(0, 2, item) 
     self.tblBoxes.horizontalHeader().setStretchLastSection(True) 
     self.tblBoxes.verticalHeader().setVisible(False) 
     self.horizontalLayout.addWidget(self.tblBoxes) 
     spacerItem1 = QtWidgets.QSpacerItem(220, 40, QtWidgets.QSizePolicy.Minimum, QtWidgets.QSizePolicy.Expanding) 
     self.horizontalLayout.addItem(spacerItem1) 
     self.tbwMain.addTab(self.tabBoxes, "") 
     MainWindow.setCentralWidget(self.centralwidget) 
     self.statusbar = QtWidgets.QStatusBar(MainWindow) 
     self.statusbar.setObjectName("statusbar") 
     MainWindow.setStatusBar(self.statusbar) 
     self.retranslateUi(MainWindow) 
     self.tbwMain.setCurrentIndex(0) 
     QtCore.QMetaObject.connectSlotsByName(MainWindow) 

    def retranslateUi(self, MainWindow): 

     # - - - - - 
     self.tblBoxes.cellActivated.connect(self.test1) 
     self.tblBoxes.cellChanged.connect(self.test2) 

    def test1(self): 
     print('Start cell edit!') 
    def test2(self): 
     print('End cell edit!') 

if __name__ == "__main__": 
    import sys 
    app = QtWidgets.QApplication(sys.argv) 
    MainWindow = QtWidgets.QMainWindow() 
    ui = Ui_MainWindow() 
    ui.setupUi(MainWindow) 
    MainWindow.show() 
    sys.exit(app.exec_()) 

繰り返しに、私は、テキスト、テーブルのセルが編集され始めたときに、「セルの編集を開始する」を印刷するための解決策を探しています。

答えて

0

これを行う方法はいくつかあります。 、あなたはQtのデザイナを使用している場合

class TableWidget(QtWidgets.QTableWidget): 
    cellEditingStarted = QtCore.pyqtSignal(int, int) 

    def edit(self, index, trigger, event): 
     result = super(TableWidget, self).edit(index, trigger, event) 
     if result: 
      self.cellEditingStarted.emit(index.row(), index.column()) 
     return result 

しかし、サブクラス化テーブル・ウィジェットを避けるためにpreferrableかもしれません:一つの方法は、テーブル・ウィジェットのedit methodを再実装、およびカスタム信号を発するようにあります代わりにitem-delegateを使用してください:

class ItemDelegate(QtWidgets.QStyledItemDelegate): 
    cellEditingStarted = QtCore.pyqtSignal(int, int) 

    def createEditor(self, parent, option, index): 
     result = super(ItemDelegate, self).createEditor(parent, option, index) 
     if result: 
      self.cellEditingStarted.emit(index.row(), index.column()) 
     return result 

class Ui_MainWindow(object): 
    ... 
    def retranslateUi(self, MainWindow): 
     self.delegate = ItemDelegate(MainWindow) 
     self.delegate.cellEditingStarted.connect(self.test1) 
     self.tblBoxes.setItemDelegate(self.delegate) 
     self.tblBoxes.cellActivated.connect(self.test2) 
+0

私はQtDesignerを使用しているので、後者を使用しました。うまく動作します、ありがとう! – Zhiming010

関連する問題