2017-12-19 5 views
1

Ich habe ein PyQt5 QTableWidget mit zwei verbundenen Signalen. Ein Signal soll Text auf dem Bildschirm auslösen und drucken, wenn der Benutzer beginnt, eine Zelle in der Tabelle zu bearbeiten; der andere soll Text feuern und drucken, wenn der Benutzer die Bearbeitung beendet hat.QTableWidget: Signal zum Erkennen des Beginns der Zellbearbeitung

Letzteres funktioniert durch Verbinden einer Funktion mit dem Signal cellChanged; Das Signal cellActivated wird jedoch nicht ausgelöst, wenn der Benutzer mit dem Bearbeiten einer Zelle in der Tabelle beginnt.

Um klar zu sein: Ich möchte ein Catch-All-Signal für jede Zeit der Zellbearbeitung beginnt (d. H. Wenn der blinkende Cursor in einer Tabellenzelle erscheint, der anzeigt, dass der Benutzer jetzt die Zelle eingeben kann). Eine Verbindung mit dem doubleClick Signal wird also nicht funktionieren. Obwohl, würde ich mich damit begnügen, es nur feuern zu lassen, wenn der Benutzer die Bearbeitung beginnt, indem er die Eingabetaste drückt.

Hier ist mein Code:

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_()) 

Um es zu wiederholen, ich bin für den Druck der Text „Start Zelle bearbeiten“, wenn eine Zelle der Tabelle nach einer Lösung gesucht beginnt bearbeitet zu werden.

Antwort

0

Es gibt verschiedene Möglichkeiten, dies zu tun. Eine Möglichkeit ist es, die edit method der Tisch Widget neu zu implementieren, und emittieren ein eigenes Signal:

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 

Wenn Sie jedoch verwenden Qt Designer, könnte es sein preferrable Unter Klassierung der Tabelle-Widget zu vermeiden, und benutze stattdessen einen 10:

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

Ich benutze letzteres seit ich QtDesigner benutze. Funktioniert gut, danke! – Zhiming010

Verwandte Themen