[英]make QTableView column read-only using 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;
}
};
然后使用 ManifestModel 代替 QSqlTableModel。
這正是我需要做的,但我不理解 C++ 語法。 有人可以幫我把它轉換成 Python。 我真的很感激。
這應該有效,但我沒有測試它:
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.
,取決於進口。
我知道這是一篇舊帖子,但由於我有點掙扎,這里是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 = []
希望對其他人有用
這就是 PyQt5 中的工作原理:
類清單模型(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
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.