Python-сообщество
![]()
- Начало
- » GUI
- » Qt, QTreeView редактируемая только одна колонка
#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_())
Первая колонка не редактируется.
Если просите код — так предоставляйте работающую “рыбу”. Поправить всегда легче, чем писать с нуля.
QAbstractItemModel, flags and a QTreeView
Эта тема была удалена. Только пользователи с правом управления темами могут её видеть.
mcleary отредактировано
When developing a QTreeView that need to change the flags (Qt::ItemFlags) for each item depending on the application state I encountered the following problem. Suppose I select 5 items in the tree view. The event selectionChanged is emitted normally for the 5 items. The user then click in a button that will perform some processing on those items in the background. While the process is going on I would like to disable the selected items so the user cannot do anything with the 5 selected items. To accomplish this I used the QAbstractItemModel::flags() method to return only the flag Qt::ItemIsSelectable. In the tree view the items are selected. But when I click in a new item the event selectionChanged doesn’t inform that the previously selected items were deselected. Is this Qt’s normal behavior?
SGaist Lifetime Qt Champion отредактировано
Hi, Do you mean that visually they are not selected anymore and not part of the deselected value from selectionChanged ?
[Qt4] QTreeWidget — как запретить редактирование item’ов в определенных столбцах?
Можно ли как попроще сделать (не изобретая лисапедов)? Для редактирования данных в нужных столбцах использую делегаты, установленные с помощью setItemDelegateForColumn(). Для столбцов, где делегаты не установлены, запускаются дефолтные редакторы. Можно это отключить как-нибудь? Обрабатывать сигналы itemClicked()/itemDoubleClicked() и потом editItem()?

mr-badguy
03.06.09 14:59:04 MSD
Re: [Qt4] QTreeWidget — как запретить редактирование item’ов в определенных столбцах?
1. в перечислении Qt::ItemFlag лежит Qt::ItemIsEditable
2. QModelIndex содержит в себе эти флаги
3. переопределяй выдачу индексов в модели: QModelIndex QAbstractItemModel::index ( int row, int column, const QModelIndex & parent = QModelIndex() ) const [pure virtual], выдавая для нужных (row, column) либо редактируемые, либо нет
PayableOnDeath ★
( 03.06.09 20:00:30 MSD )

Re: [Qt4] QTreeWidget — как запретить редактирование item’ов в определенных столбцах?
Не понятно как выдать индекс с нужными флагами. У QModelIndex ведь нет setFlags()?
mr-badguy
( 04.06.09 08:54:36 MSD ) автор топика
Re: [Qt4] QTreeWidget — как запретить редактирование item’ов в определенных столбцах?
да, это я не учёл, тогда вот:
> Qt::ItemFlags QAbstractItemModel::flags ( const QModelIndex & index ) const [virtual]
> Returns the item flags for the given index.
> The base class implementation returns a combination of flags that enables the item (ItemIsEnabled) and allows it to be selected (ItemIsSelectable).
Переопредели просто эту функцию, чтобы возращала флаги индекса для редактируемых и флаги без ItemIsEditable для остальных
PayableOnDeath ★
( 04.06.09 09:32:54 MSD )
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.
Похожие темы
- Форум запретить проброс определенных портов (2010)
- Форум Запрет редактирования панели задач cinnamon (2014)
- Форум запрет удаления и редактирования файлов (2018)
- Форум Удаление столбцов из файла в определенных местах (2017)
- Форум [Qt4][Сторонние виджеты] Есть удобное редактирование даты? (2009)
- Форум Postgres запрет на редактирование архивной строки (2021)
- Форум Запретить автоматическое монтирование определённых UUID (2020)
- Форум Запретить portage создавать определеные каталоги (2019)
- Форум Запретить опеделенному пользователю определенные команды (2008)
- Форум запретить доступ выше определённого каталога? (2012)
How to set ItemFlag in QTreeView or QListView?
UPDATE1: QTreeView based on QFileSystemModel(). How to «setFlags» on specified tree item? in a subclass QFileSystemModel()?
class MyTreeModel(QFileSystemModel): def __init__(self, parent=None): super(MyTreeModel, self).__init__(parent) # fake code: if current_index.parent() == treeView.rootIndex(): # it is a second level folder. # set this tree item not selectable. current_index.setFlags(^ Qt.ItemIsSelectable)
asked Feb 1, 2021 at 11:35
170 1 1 silver badge 12 12 bronze badges
What items and based on what? Can that flag change for any reason during runtime? Is the model static or does it layout change? The flags are always provided by the model (meaning flags() must be reimplemented); if you want to be able to programmatically set flags for a specific index, you should keep internal references for each index and its customized flags (if any). That said, please provide a minimal, reproducible example to begin with, the question is too broad.
Feb 1, 2021 at 13:25
1 Answer 1
I got inspiration from here: TreeView in Python+QT
Similar to setData(), you cannot setData() to QFileSystemModel, but you can modify data() to add your code when reading data from the model.
You can’t directly setFlags() to QFileSystemModel, but you can modify flags() to change the returned data.
class MyTreeModel(QtWidgets.QFileSystemModel): #. def flags(self, index): flags = super(MyTreeModel, self).flags(index) # Determine directory level. if self.index_level(index) == 2: flags = flags ^ QtCore.Qt.ItemIsSelectable return flags