2016-06-24 10 views
0

Ich habe die Archive durchsucht, und ich fand den folgenden Code:machen QTableView Spalte schreibgeschützt Python

class ManifestModel: public QSqlTableModel 
{ 
public: 
    ManifestModel(QObject * parent = 0, QSqlDatabase db = QSqlDatabase()): 
     QSqlTableModel(parent, db) 
    { } 
    ~ManifestModel() { } 
    Qt::ItemFlags flags (const QModelIndex & index) const 
    { 
     if (index.column() == 2) 
      return Qt::ItemIsEnabled | Qt::ItemIsSelectable | Qt::ItemIsEditable; 
     else 
      return Qt::ItemIsEnabled | Qt::ItemIsSelectable; 
    } 
}; 

Dann ManifestModel verwenden anstelle von QSqlTableModel.

Das tut genau das, was ich tun muss, aber ich verstehe C++ Syntax nicht. Könnte jemand das bitte für mich in Python konvertieren. Ich würde das wirklich zu schätzen wissen.

Antwort

0

Dies ist, was in PyQt5 funktioniert:

Klasse ManifestModel (QtSql.QSqlTableModel):

def __init__(self, parent=None, db=QtSql.QSqlDatabase()): 
    super(ManifestModel, self).__init__(parent, db) 

def flags(self, index): 
    if (index.column() == 4): 
     return QtCore.Qt.ItemIsEnabled 
    elif (index.column() == 6): 
     return QtCore.Qt.ItemIsEnabled 
    else: 
     return QtCore.Qt.ItemIsEnabled | QtCore.Qt.ItemIsSelectable | QtCore.Qt.ItemIsEditable 
1

Dies sollte funktionieren, aber ich habe es nicht getestet:

from PyQt4.QtCore import Qt 
from PyQt4.QtSql import QSqlTableModel, QSqlDatabase 


class ManifestModel(QSqlTableModel): 

    def __init__(self, parent=None, db=QSqlDatabase()): 
     super(ManifestModel, self).__init__(parent, db) 

    def flags(self, index): 
     if (index.column() == 2): 
      return Qt.ItemIsEnabled | Qt.ItemIsSelectable | Qt.ItemIsEditable 
     else: 
      return Qt.ItemIsEnabled | Qt.ItemIsSelectable 

Die __init__ Methode ist das Äquivalent des C++ Konstruktor ManifestModel(). super ruft den übergeordneten Konstruktor auf, hier QSqlTableModel. Sie sollten diesem Muster immer folgen, wenn Sie Unterklassen erstellen.

Die Methode ~ManifestModel() ist ein Destruktor, in Python muss man sich normalerweise keine Gedanken darüber machen, man muss keine Methode definieren.

flags eine Klassenmethode ist, die C++ Syntax

TypeOfOutput functionName(typeOfParameter1 parameter1){} 

hat eine einfachere Äquivalent in Python:

functionName(self, parameter1): 

Schließlich ist die C++ Qt:: wird Qt. oder QtCore.Qt., abhängig von den Importen.

+1

Mein Rat ist, versuchen Verwendung der C++ Syntax zu erhalten, die doc Qt in C++ ist viel besser als das PyQt-Dokument (es ist einfacher zu lesen und zu durchsuchen meiner Meinung nach). – Mel

+0

Das sieht so aus, als müsste es funktionieren. Ich werde es testen, wenn ich nächste Woche zur Arbeit gehe. Anscheinend soll ich dir nicht danken? Ich stimme der C++ - Syntax zu, aber ich sehe nicht, wie ich es tun kann, ohne C++ zu programmieren, was ich nicht machen möchte. – nlgootee

+0

Ich versuche, den Code zu verwenden, den Sie mir gegeben haben, aber ich erhalte einen Fehler. – nlgootee