Как зафиксировать данные в QTableView с помощью клавиши «TAB» (PyQt)? - PullRequest
0 голосов
/ 07 октября 2018

Я написал код для QTableView с QSqlRelationalTableModel & QSqlRelationalTableDelegate .(Пример кода приведен ниже)

Как показано на рисунке, Столбец-1 содержит редактор строк, а Столбец-2 и 3 содержит поля со списками, которые являются значениями по умолчанию.QSqlRelationalTableModel.

Моя проблема в том, что, перемещаясь по таблице с помощью клавиши 'TAB' , я могу добавить текст в столбец-1.

Но при вводе в колонки 2 и 3 клавиша 'TAB' не позволяет мне зафиксировать данные и перейти к следующей ячейке.Вместо этого я должен использовать ENTER для фиксации данных.

Я пытаюсь добиться этого только с помощью клавиши «TAB».Как это сделать?

enter image description here

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