Binding - Event mit Return-Taste
Verfasst: Mittwoch 5. Juli 2017, 14:50
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.
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!
Wäre schö, wenn mir Jemand anhand des Codes zeigen würde, was ich falsch mache!
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()
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.