使用Python将QTableView列设置为只读

时间:2016-06-24 18:43:05

标签: python pyqt qtableview

我搜索了档案,发现了以下代码:

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;
    }
};

然后使用ManifestModel代替QSqlTableModel。

这正是我需要做的,但我不了解C ++语法。有人可以请我把它转换成Python。我真的很感激。

3 个答案:

答案 0 :(得分:1)

这应该有效,但我没有测试它:

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

__init__方法相当于C ++构造函数ManifestModel()super调用父构造函数,QSqlTableModel。在继承子类时,你应该始终遵循这种模式。

方法~ManifestModel()是一个析构函数,你通常不需要在python中担心它,没有必要定义一个方法。

flags是一种类方法,即C ++语法

TypeOfOutput functionName( typeOfParameter1 parameter1){}

在python中有一个更简单的等价物:

functionName(self, parameter1): 

最后,C ++ Qt::变为Qt.QtCore.Qt.,具体取决于导入。

答案 1 :(得分:1)

我知道这是一篇旧帖子,但由于我有点挣扎,这里是 QStandardItemModel 的扩展解决方案。可以选择将哪些列设置为只读,将它们的列表传递给 MyStandardItemModel.setReadOnly

class MyStandardItemModel(QStandardItemModel):

    def __init__(self, parent=None, *arg, **kwargs):
        super().__init__(parent, *arg, **kwargs)
        self.__readonly_cols = []

    def flags(self, index: QtCore.QModelIndex) -> QtCore.Qt.ItemFlags:
            if (index.column() in self.__readonly_cols):
                return QtCore.Qt.ItemIsEnabled
            else:
                return QtCore.Qt.ItemIsEnabled | QtCore.Qt.ItemIsSelectable | QtCore.Qt.ItemIsEditable

    def setReadOnly(self, columns: [int]):
        for i in columns:
            if i <= (self.columnCount() - 1) and i not in self.__readonly_cols:
                self.__readonly_cols.append(i)

    def resetReadOnly(self):
        self.__readonly_cols = []

希望对大家有用

答案 2 :(得分:0)

这适用于PyQt5:

类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