Уведомления

Группа в Telegram: @pythonsu
  • Начало
  • » GUI
  • » Qt, QTreeView редактируемая только одна колонка [RSS Feed]

#1 Дек. 16, 2010 14:46:54

Iv_
От:
Зарегистрирован: 2010-03-09
Сообщения: 35
Репутация: +  0  -
Профиль   Отправить e-mail  

Qt, QTreeView редактируемая только одна колонка

Есть 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) только для элементов определененной колонки?



Офлайн

#2 Дек. 17, 2010 13:33:32

Iv_
От:
Зарегистрирован: 2010-03-09
Сообщения: 35
Репутация: +  0  -
Профиль   Отправить e-mail  

Qt, QTreeView редактируемая только одна колонка

нашел на просторах интернета следующее:

Как в 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; // остальные нет
}
Что то не пойму нифига как его “питонизировать”. Подскажите, плиииз



Офлайн

#3 Дек. 20, 2010 08:19:57

Iv_
От:
Зарегистрирован: 2010-03-09
Сообщения: 35
Репутация: +  0  -
Профиль   Отправить e-mail  

Qt, QTreeView редактируемая только одна колонка

пока решил проблему следующим образом, повесил обработчики на события двойного клика и изменение текущего элемента

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
В принципе работает, но я ищу другие способы…
Хотелось бы всё же через флаги..



Офлайн

#4 Дек. 20, 2010 09:14:20

Андрей Светлов
От:
Зарегистрирован: 2007-05-15
Сообщения: 3137
Репутация: +  14  -
Профиль   Адрес электронной почты  

Qt, QTreeView редактируемая только одна колонка

Чудак-человек.
Черным по белому написано: унаследуйте модель, переопределите метод flags.



Офлайн

#5 Дек. 20, 2010 10:48:13

Iv_
От:
Зарегистрирован: 2010-03-09
Сообщения: 35
Репутация: +  0  -
Профиль   Отправить e-mail  

Qt, QTreeView редактируемая только одна колонка

Если бы я знал как это сделать - не спрашивал бы. Если не лень, кинь кусочек кода. Учусь в основном по примерам.



Офлайн

#6 Дек. 20, 2010 13:36:29

Андрей Светлов
От:
Зарегистрирован: 2007-05-15
Сообщения: 3137
Репутация: +  14  -
Профиль   Адрес электронной почты  

Qt, QTreeView редактируемая только одна колонка

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_())
Первая колонка не редактируется.

Если просите код - так предоставляйте работающую “рыбу”. Поправить всегда легче, чем писать с нуля.



Офлайн

  • Начало
  • » GUI
  • » Qt, QTreeView редактируемая только одна колонка[RSS Feed]

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version