Форум сайта python.su
Есть QtreeView с данными. Данные в двух колонках. Как сделать возможность редактирования только у одной колонки? Сейчас код такой
for c_ in col:
item = QtGui.QTreeWidgetItem([unicode(c_),''])
item.setCheckState(0,QtCore.Qt.Unchecked)
item.setFlags(QtCore.Qt.ItemIsUserCheckable | QtCore.Qt.ItemIsSelectable | QtCore.Qt.ItemIsEditable | QtCore.Qt.ItemIsEnabled )
wind.ui.list.addTopLevelItem(item)
Офлайн
нашел на просторах интернета следующее:
Как в QTreeView запретить редактирование?Что то не пойму нифига как его “питонизировать”. Подскажите, плиииз
Необходимо переопределить в модели функцию flags:
Qt::ItemFlags QMyTreeModel::flags(const QModelIndex & index) const
{
if(index.column() == 1) return Qt::ItemIsEnabled | Qt::ItemIsSelectable | Qt::ItemIsEditable; // вторую колонку можно редактировать
return Qt::ItemIsEnabled | Qt::ItemIsSelectable; // остальные нет
}
Офлайн
пока решил проблему следующим образом, повесил обработчики на события двойного клика и изменение текущего элемента
self.connect(self.ui.list, QtCore.SIGNAL('itemDoubleClicked(QTreeWidgetItem *, int)'), gui.functions_gui.doubleClick)
self.connect(self.ui.list, QtCore.SIGNAL('currentItemChanged (QTreeWidgetItem *, QTreeWidgetItem *)'), gui.functions_gui.currentItemChanged)
def doubleClick(item, column):
'''
обработка двойного клика по списку, с целью редактирования
'''
if column == 1 : # для второй колонки есть редактирование, для других не будет
item.treeWidget().openPersistentEditor(item, column) # начало редактирования
def currentItemChanged(current, previous):
'''
событие изменение айтема
'''
try:
tree = current.treeWidget()
for col in xrange(tree.columnCount()):
tree.closePersistentEditor(previous, col) # окончание редактирования
except:
pass
Офлайн
Чудак-человек.
Черным по белому написано: унаследуйте модель, переопределите метод flags.
Офлайн
Если бы я знал как это сделать - не спрашивал бы. Если не лень, кинь кусочек кода. Учусь в основном по примерам.
Офлайн
import sys
import collections
from PyQt4 import QtCore, QtGui
class Model(QtGui.QStandardItemModel):
def __init__(self, parent=None):
super(Model, self).__init__(parent)
root = self.invisibleRootItem()
root.appendRow([QtGui.QStandardItem('A'), QtGui.QStandardItem('1')])
a = root.child(0)
a.appendRow([QtGui.QStandardItem('B'), QtGui.QStandardItem('2')])
a.appendRow([QtGui.QStandardItem('C'), QtGui.QStandardItem('3')])
root.appendRow([QtGui.QStandardItem('D'), QtGui.QStandardItem('4')])
d = root.child(1)
d.appendRow([QtGui.QStandardItem('E'), QtGui.QStandardItem('5')])
def columnCount(self, index=QtCore.QModelIndex()):
return 2
def flags(self, index):
default = super(Model, self).flags(index)
if index.isValid():
if index.column() == 0:
default &= ~QtCore.Qt.ItemIsEditable
return default
def headerData(self, section, orientation, role=QtCore.Qt.DisplayRole):
if role == QtCore.Qt.DisplayRole:
return ['First', 'Second'][section]
return None
class W(QtGui.QMainWindow):
def __init__(self):
super(W, self).__init__()
self.view = QtGui.QTreeView()
self.setCentralWidget(self.view)
self.view.setModel(Model())
self.view.expandAll()
app = QtGui.QApplication(sys.argv)
w = W()
w.show()
sys.exit(app.exec_())
Офлайн