2017-12-19 4 views
1

두 개의 연결된 신호가있는 PyQt5 QTableWidget이 있습니다. 하나의 신호는 사용자가 테이블에서 셀을 편집하기 시작할 때 화면에 텍스트를 인쇄하고 인쇄하기위한 것입니다. 다른 하나는 사용자가 편집을 마칠 때 텍스트를 인쇄하고 인쇄하기위한 것입니다.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

이렇게하는 방법에는 여러 가지가 있습니다. 한 가지 방법은 테이블 위젯의 edit method 다시 구현하고, 사용자 정의 신호를 방출하는 것입니다 : 당신이 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 

는 그러나,이 테이블 위젯을 하위 클래스라는 피할보다 더 낫다 수 있습니다를, 대신 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