Я написал код для QTableView с QSqlRelationalTableModel & QSqlRelationalTableDelegate .(Пример кода приведен ниже)
Как показано на рисунке, Столбец-1 содержит редактор строк, а Столбец-2 и 3 содержит поля со списками, которые являются значениями по умолчанию.QSqlRelationalTableModel.
Моя проблема в том, что, перемещаясь по таблице с помощью клавиши 'TAB' , я могу добавить текст в столбец-1.
Но при вводе в колонки 2 и 3 клавиша 'TAB' не позволяет мне зафиксировать данные и перейти к следующей ячейке.Вместо этого я должен использовать ENTER для фиксации данных.
Я пытаюсь добиться этого только с помощью клавиши «TAB».Как это сделать?
from PyQt4.QtGui import *
from PyQt4.QtCore import *
from PyQt4.QtSql import *
import os
import sys
import random
def StudentQuery():
StudentQuery = QSqlQuery()
StudentQuery.exec_("DROP TABLE STUDENTS")
StudentQuery.exec_("""CREATE TABLE STUDENTS (
SUB VARCHAR(20) NULL,
GRD1 REAL NULL,
GRD2 REAL NULL)""")
Students = ("STD1", "STD2", "STD3")
StudentQuery.prepare("INSERT INTO STUDENTS (SUB, GRD1, GRD2) VALUES (?, ?, ?)")
for Student in Students:
SUB = ''
GRD1 = None
GRD2 = None
StudentQuery.addBindValue(QVariant(SUB))
StudentQuery.addBindValue(QVariant(GRD1))
StudentQuery.addBindValue(QVariant(GRD2))
StudentQuery.exec_()
QApplication.processEvents()
def GradeQuery():
GradeQuery = QSqlQuery()
GradeQuery.exec_("DROP TABLE GRADE")
GradeQuery.exec_("""CREATE TABLE GRADE (
id INTEGER PRIMARY KEY AUTOINCREMENT UNIQUE NOT NULL,
grd VARCHAR NULL)""")
Grade = ("A", "B", "C")
GradeQuery.prepare("INSERT INTO GRADE (grd) VALUES (?)")
for grade in Grade:
grd = grade
GradeQuery.addBindValue(QVariant(grd))
GradeQuery.exec_()
QApplication.processEvents()
class Ui_Student(QDialog):
def __init__(self, parent=None):
super(Ui_Student, self).__init__(parent)
self.setFixedSize(340, 170)
self.setWindowTitle("STUDENT")
self.model = STDModel(self)
self.model.setTable("STUDENTS")
self.model.setRelation(1, QSqlRelation("GRADE", "id", "grd"))
self.model.setRelation(2, QSqlRelation("GRADE", "id", "grd"))
self.model.setEditStrategy(QSqlTableModel.OnManualSubmit)
self.model.select()
self.view = QTableView(self)
self.view.setGeometry(QRect(10, 10, 320, 120))
self.view.setSelectionBehavior(QAbstractItemView.SelectItems)
self.view.setItemDelegate(STDDelegate(self))
self.view.setFocusPolicy(Qt.StrongFocus)
self.view.setModel(self.model)
QSqlDatabase.database().commit()
self.buttonBox = QDialogButtonBox(self)
self.buttonBox.setGeometry(QRect(118, 127, 100, 45))
self.buttonBox.setOrientation(Qt.Horizontal)
self.buttonBox.setStandardButtons(QDialogButtonBox.Cancel | QDialogButtonBox.Ok)
QObject.connect(self.buttonBox, SIGNAL("accepted()"), self.accept)
QObject.connect(self.buttonBox, SIGNAL("rejected()"), self.reject)
class STDModel(QSqlRelationalTableModel):
def __init__(self, parent=None):
super(STDModel, self).__init__(parent)
def rowCount(self, index=QModelIndex()):
return 3
def columnCount(self, index=QModelIndex()):
return 3
def headerData(self, section, orientation, role):
if role == Qt.TextAlignmentRole:
if orientation == Qt.Horizontal:
return QVariant(int(Qt.AlignCenter))
return QVariant(int(Qt.AlignRight|Qt.AlignVCenter))
if role != Qt.DisplayRole:
return QVariant()
if orientation == Qt.Horizontal:
if section == 0:
return QVariant("Subject")
elif section == 1:
return QVariant("STD1")
elif section == 2:
return QVariant("STD2")
class STDDelegate(QSqlRelationalDelegate):
def __init__(self, parent=None):
super(STDDelegate, self).__init__(parent)
self.installEventFilter(self)
def createEditor(self, parent, option, index):
if index.column() == 0:
editor = QLineEdit(parent)
editor.setContextMenuPolicy(Qt.NoContextMenu)
return editor
else:
return QSqlRelationalDelegate.createEditor(self, parent, option, index)
if __name__ == "__main__":
app = QApplication(sys.argv)
filename = os.path.join(os.path.dirname(__file__), "STD.db")
db = QSqlDatabase.addDatabase("QSQLITE")
db.setDatabaseName(filename)
db.open()
StudentQuery()
GradeQuery()
form = Ui_Student()
form.show()
sys.exit(app.exec_())