Форум сайта python.su
Здравствуй, любимое сообщество!
Буду краток.
Есть табличная модель и таблица в приложении. Юзер должен интуитивно понять, что он может добавлять/заменять/очищать содержимое столбцов, путём загрузки строк из текстовых файлов. Однако, при реализации GUI возникли сложности с выбором способа подачи этой информации юзеру:
1. Вставить свои виджеты в заголовки таблицы можно, но это такой геморрой (извиняюсь), что 5 потраченных почти впустую дней гугления, самостоятельной реализации, копипастов, портов в Qt (C++) и прочей лабуды были потрачены зря. Делегаты с QHeaderView не работают.
2. Реализовать всё одной кнопкой “Открыть…” с кастомизацией QFileDialog - это тоже то ещё счастье. Теряется суть подхода “нажал - выбрал - сделал”. Хотя, реализовать это получилось без труда.
3. Вставлять виджеты в ячейки не намного удобнее, чем п.1, тем более, что связывать потом сигналы и слоты становится трудной задачей, да и обычная реализация виджетов в ячейках через делегаты ведь доступна только для редактируемых элементов.
4. Делать целый тулбар, в котором можно добавить несколько кнопок для добавления/замены/очистки столбцов видится более-менее удобным, но не намного удобнее, чем п.2.
5. Пока самым удобным способом видится только контекстное меню на каждом заголовке, но это так неочевидно.
6. Была даже мысль сделать контекстные менюшки для каждой ячейки, чтобы можно было манипулировать данными столбца, относительно текущего положения: добавить до текущей ячейки, добавить после текущей ячейки, заменить текущую ячейку; а в контекстой менюшке на заголовке: добавить в начало столбца, добавить в конец столбца, очистить столбец, заменить данные в столбце, и т.п. Однако, это так же неочевидно, как в п.5, да и первым делом в голове мелькает мысль о целесообразности доступа к такого рода манипуляциям (приложение довольно простое, но планируется как масштабируемое).
Остальные способы ещё не придумал, поэтому очень прошу помочь разобраться в этом, определить наиболее удобный и очевидный способ дать юзеру возможность подгружать данные или изменять текущие, относительно существующего фиксированного набора столбцов (всего их 8, из которых всего 5 - доступны для манипуляций, а остальные 3 - это дополнительная инфа, вроде чекбоксов, картинок, примечаний).
На всякий случай, вот второй маленький вопросик. Насколько лучше или хуже, вместо манипуляций с методами вставки/удаления строк и сотлбцов, пользоваться возможностью изменять массив данных, используя лишь сигнализирование “beginResetModel()” и “endResetModel()”, независимо от общего количества данных в таблице (модели) и количества изменяемых данных.
Например, для очистки всей таблицы, я использую вот такой способ, вместо удаления строк/столбцов (код комментом “# ВОТ ТАК:”):
class UserTableModel(QtCore.QAbstractTableModel):
def __init__(self, data = [[]], headers = [], parent = None):
QtCore.QAbstractTableModel.__init__(self, parent)
if headers:
self.__data = [[[]] * len(headers)] # just for DEBUG
else:
self.__data = data
self.__headers = headers
........
# ВОТ ТАК:
def clear(self):
self.beginResetModel()
self.__data = []
self.endResetModel()
Отредактировано (Март 22, 2012 14:09:44)
Офлайн