Найти - Пользователи
Полная версия: Qt, QTreeView редактируемая только одна колонка
Начало » GUI » Qt, QTreeView редактируемая только одна колонка
1
Iv_
Есть 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)
Редактируются, понятно, все колонки.
Как установить данный флаг (QtCore.Qt.ItemIsEditable) только для элементов определененной колонки?
Iv_
нашел на просторах интернета следующее:

Как в 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; // остальные нет
}
Что то не пойму нифига как его “питонизировать”. Подскажите, плиииз
Iv_
пока решил проблему следующим образом, повесил обработчики на события двойного клика и изменение текущего элемента
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.
Iv_
Если бы я знал как это сделать - не спрашивал бы. Если не лень, кинь кусочек кода. Учусь в основном по примерам.
Андрей Светлов
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_())
Первая колонка не редактируется.

Если просите код - так предоставляйте работающую “рыбу”. Поправить всегда легче, чем писать с нуля.
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB