Binding - Event mit Return-Taste

Python und das Qt-Toolkit, erstellen von GUIs mittels des Qt-Designers.
Antworten
Nobuddy
User
Beiträge: 994
Registriert: Montag 30. Januar 2012, 16:38

Hallo zusammen,

Folgender Code, erstellt eine Tabelle. In der Tabelle kann ich mit den Richtungstasten den Cursor bewegen und mit einem DoppelKlick kann ich mir eine Datenzeile ausgeben lassen.

Code: Alles auswählen

import operator  # used for sorting
from PyQt4.QtCore import Qt, QAbstractTableModel, SIGNAL, pyqtSignal, QObject
from PyQt4.QtGui import QWidget, QTableView, QApplication, QVBoxLayout

class MyWindow(QWidget):
    def __init__(self, dataList, header, *args):
        QWidget.__init__(self, *args)
        # setGeometry(x_pos, y_pos, width, height)
        self.setGeometry(70, 150, 420, 250)
        self.setWindowTitle("Click on the header to sort table")

        self.table_model = MyTableModel(self, dataList, header)

        table_view = QTableView()

        # bind cell click to a method reference
        table_view.doubleClicked.connect(self.showSelection)

        table_view.setModel(self.table_model)
        # enable sorting
        table_view.setSortingEnabled(True)

        layout = QVBoxLayout(self)
        layout.addWidget(table_view)
        self.setLayout(layout)

    def showSelection(self, item):
        mylist = self.table_model.sorted_list()
        dataset = mylist[item.row()]
        print('dataset', dataset)


class MyTableModel(QAbstractTableModel):
    """
    keep the method names
    they are an integral part of the model
    """
    def __init__(self, parent, mylist, header, *args):
        QAbstractTableModel.__init__(self, parent, *args)
        self.mylist = mylist
        self.header = header

    def rowCount(self, parent):
        return len(self.mylist)

    def columnCount(self, parent):
        return len(self.mylist[0])

    def data(self, index, role):
        if not index.isValid():
            return None
        elif role != Qt.DisplayRole:
            return None
        return self.mylist[index.row()][index.column()]

    def headerData(self, col, orientation, role):
        if orientation == Qt.Horizontal and role == Qt.DisplayRole:
            return self.header[col]
        return None

    def sort(self, col, order):
        """sort table by given column number col"""
        self.emit(SIGNAL("layoutAboutToBeChanged()"))
        self.mylist = sorted(self.mylist,
            key=operator.itemgetter(col))
        if order == Qt.DescendingOrder:
            self.mylist.reverse()
        self.emit(SIGNAL("layoutChanged()"))

    def sorted_list(self):
        return self.mylist


def main():
    # you could process a CSV file to create this data
    header = ['First Name', 'Last Name', 'Age', 'Weight']
    # a list of (fname, lname, age, weight) tuples
    dataList = [
        ('Ben', 'Dover', 36, 127),
        ('Foster', 'Krampf', 27, 234),
        ('Barry', 'Chaurus', 19, 315),
        ('Sede', 'Anowski', 59, 147),
        ('Carolus', 'Gabel', 94, 102),
        ('Michel', 'Zittus', 21, 175),
        ('Annie', 'Waters', 31, 114)
        ]

    app = QApplication([])
    win = MyWindow(dataList, header)
    win.show()
    result = app.exec_()

if __name__ == '__main__':
    main()
Ich möchte nun erreichen, dass statt dem DoppelKlick mit der Maus, mit der Tastatur durch die Return- oder die Enter-Taste umgesetzt wird.
Es ist einfach vom Handling einfacher, wenn man mit den Richtungstasten agiert, die Return- oder die Enter-Taste auszulösen.

Ich habe schon viel gegoogelt, da aber mein Englisch sehr schlecht ist, habe ich ein Problem mit der Umsetzung.
Mit folgenden Code, habe ich schon versucht zum Ziel zu kommen.
So wie ich es anwende, funktioniert es aber nicht!

Code: Alles auswählen

class MyEventFilter(QObject):

    enterPressed = pyqtSignal()

    def __init__(self):
        QObject.__init__(self)

    def keyPressEvent(self, event): #QKeyEvent
        if event.key() == Qt.Key_Enter or event.key() == Qt.Key_Return:
            self.enterPressed.emit()
            print('enter key pressed')


class MyWindow(QWidget):
    def __init__(self, dataList, header, *args):
        QWidget.__init__(self, *args)
        # setGeometry(x_pos, y_pos, width, height)
        self.setGeometry(70, 150, 420, 250)
        self.setWindowTitle("Click on the header to sort table")
        self.filter = MyEventFilter()
        self.installEventFilter(self.filter)

       .... usw.
Wäre schö, wenn mir Jemand anhand des Codes zeigen würde, was ich falsch mache!
Nobuddy
User
Beiträge: 994
Registriert: Montag 30. Januar 2012, 16:38

Habe nun selbst eine Lösung. :D

Code: Alles auswählen

import operator  # used for sorting
from PyQt4.QtCore import Qt, QAbstractTableModel, SIGNAL, QEvent
from PyQt4.QtGui import QWidget, QTableView, QApplication, QVBoxLayout


class MyWindow(QWidget):
    def __init__(self, dataList, header, *args):
        QWidget.__init__(self, *args)
        self.installEventFilter(self)
        # setGeometry(x_pos, y_pos, width, height)
        self.setGeometry(70, 150, 420, 250)
        self.setWindowTitle("Click on the header to sort table")

        self.table_model = MyTableModel(self, dataList, header)

        self.table_view = QTableView()

        self.table_view.setModel(self.table_model)
        # enable sorting
        self.table_view.setSortingEnabled(True)

        layout = QVBoxLayout(self)
        layout.addWidget(self.table_view)
        self.setLayout(layout)

    def eventFilter(self, widget, event):
        if event.type() == QEvent.KeyPress and widget is self:
            key = event.key()
            if key == Qt.Key_Escape:
                print('escape')
            else:
                if key == Qt.Key_Return or key == Qt.Key_Enter:
                    mylist = self.table_model.sorted_list()
                    index = self.table_view.selectedIndexes()[0].row()
                    dataset = mylist[index]
                    print('dataset', dataset)
                return True
        return QWidget.eventFilter(self, widget, event)


class MyTableModel(QAbstractTableModel):
    """
    keep the method names
    they are an integral part of the model
    """
    def __init__(self, parent, mylist, header, *args):
        QAbstractTableModel.__init__(self, parent, *args)
        self.mylist = mylist
        self.header = header

    def rowCount(self, parent):
        return len(self.mylist)

    def columnCount(self, parent):
        return len(self.mylist[0])

    def data(self, index, role):
        if not index.isValid():
            return None
        elif role != Qt.DisplayRole:
            return None
        return self.mylist[index.row()][index.column()]

    def headerData(self, col, orientation, role):
        if orientation == Qt.Horizontal and role == Qt.DisplayRole:
            return self.header[col]
        return None

    def sort(self, col, order):
        """sort table by given column number col"""
        self.emit(SIGNAL("layoutAboutToBeChanged()"))
        self.mylist = sorted(self.mylist,
            key=operator.itemgetter(col))
        if order == Qt.DescendingOrder:
            self.mylist.reverse()
        self.emit(SIGNAL("layoutChanged()"))

    def sorted_list(self):
        return self.mylist


def main():
    # you could process a CSV file to create this data
    header = ['First Name', 'Last Name', 'Age', 'Weight']
    # a list of (fname, lname, age, weight) tuples
    dataList = [
        ('Ben', 'Dover', 36, 127),
        ('Foster', 'Krampf', 27, 234),
        ('Barry', 'Chaurus', 19, 315),
        ('Sede', 'Anowski', 59, 147),
        ('Carolus', 'Gabel', 94, 102),
        ('Michel', 'Zittus', 21, 175),
        ('Annie', 'Waters', 31, 114)
        ]

    app = QApplication([])
    win = MyWindow(dataList, header)
    win.show()
    result = app.exec_()

if __name__ == '__main__':
    main()
Antworten