crossplatform.ru

Здравствуйте, гость ( Вход | Регистрация )

 
Ответить в данную темуНачать новую тему
> QTableWidget, Редактирование ячеек
rcdimon
  опции профиля:
сообщение 21.11.2009, 14:02
Сообщение #1


Студент
*

Группа: Участник
Сообщений: 69
Регистрация: 27.10.2009
Пользователь №: 1183

Спасибо сказали: 1 раз(а)




Репутация:   0  


У меня в вопроса по таблицам.

Как запретить редактирование определенного столбца?
Как отслеживать операцию окончания редактирования ячейки?
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Rocky
  опции профиля:
сообщение 21.11.2009, 15:55
Сообщение #2


Старейший участник
****

Группа: Участник
Сообщений: 530
Регистрация: 22.12.2008
Из: Санкт-Петербург
Пользователь №: 463

Спасибо сказали: 22 раз(а)




Репутация:   7  


Как запретить редактирование определенного столбца?
Имхо только по ячейкам можно сделать. Т.е. при добавлении новой строки брать QTableWidgetItem* для нужного столбца, которуму хотим запретить редактирование и делаем например так:
pItem0->setFlags(Qt::ItemIsEditable^2); 
pItem0->setTextColor(Qt::black);

Как отслеживать операцию окончания редактирования ячейки?
void QTableWidget::cellChanged ( int row, int column )
void itemChanged ( QTableWidgetItem * item )
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
igor_bogomolov
  опции профиля:
сообщение 21.11.2009, 16:04
Сообщение #3


Профессионал
*****

Группа: Сомодератор
Сообщений: 1215
Регистрация: 22.3.2009
Из: Саратов
Пользователь №: 630

Спасибо сказали: 235 раз(а)




Репутация:   29  


1. Можно сделать через делегат
class Delegate : public QItemDelegate
{
    Q_OBJECT
public:
    Delegate(QObject * parent = 0) : QItemDelegate(parent) {}
    virtual QWidget * createEditor ( QWidget *, const QStyleOptionViewItem &,
                                     const QModelIndex &) const
    {
        return 0;
    }
};

table->setItemDelegateForColumn(0, new Delegate());
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
rcdimon
  опции профиля:
сообщение 21.11.2009, 16:11
Сообщение #4


Студент
*

Группа: Участник
Сообщений: 69
Регистрация: 27.10.2009
Пользователь №: 1183

Спасибо сказали: 1 раз(а)




Репутация:   0  


Цитата
void itemChanged ( QTableWidgetItem * item )


Действительно работает. Но с ним есть проблемка- этот сигнал посылается не только после окончания редактирования ячейки, но и после ее создания методом setItem.

Надо либо как-то различать эти 2 события, либо игнорировать setItem
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
igor_bogomolov
  опции профиля:
сообщение 21.11.2009, 16:18
Сообщение #5


Профессионал
*****

Группа: Сомодератор
Сообщений: 1215
Регистрация: 22.3.2009
Из: Саратов
Пользователь №: 630

Спасибо сказали: 235 раз(а)




Репутация:   29  


Цитата(rcdimon @ 21.11.2009, 16:11) *
Но с ним есть проблемка- этот сигнал посылается не только после окончания редактирования ячейки, но и после ее создания методом setItem.
Для меня это тоже является огромной проблемой. Нормального решения я так и не нашёл.
Сейчас использую костыль, опять же таки из делегата. Просто отправляю свой сигнал из QItemDelegate::setModelData(...).
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
rcdimon
  опции профиля:
сообщение 21.11.2009, 16:21
Сообщение #6


Студент
*

Группа: Участник
Сообщений: 69
Регистрация: 27.10.2009
Пользователь №: 1183

Спасибо сказали: 1 раз(а)




Репутация:   0  


я просто еще не знаю что такое делегат... Но идея есть такая- отключать сигнал до наполнения таблицы ячейками и после делать connect заново )
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Litkevich Yuriy
  опции профиля:
сообщение 21.11.2009, 16:35
Сообщение #7


разработчик РЭА
*******

Группа: Сомодератор
Сообщений: 9669
Регистрация: 9.1.2008
Из: Тюмень
Пользователь №: 64

Спасибо сказали: 807 раз(а)




Репутация:   94  


Цитата(rcdimon @ 21.11.2009, 19:11) *
Надо либо как-то различать эти 2 события, либо игнорировать setItem
можно блокировать сигнал перед созданием элемента, а после создания разблокировать bool QObject::blockSignals ( bool block )
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Rocky
  опции профиля:
сообщение 21.11.2009, 16:54
Сообщение #8


Старейший участник
****

Группа: Участник
Сообщений: 530
Регистрация: 22.12.2008
Из: Санкт-Петербург
Пользователь №: 463

Спасибо сказали: 22 раз(а)




Репутация:   7  


Я через флаг делал. По типу перед началом заполнения m_bFlag = false; после - true. А в самом слоте if (!m_bFlag) return;
Хотя наверное щас буду все переделывать на blockSignals ))
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

Быстрый ответОтветить в данную темуНачать новую тему
Теги
Нет тегов для показа


3 чел. читают эту тему (гостей: 3, скрытых пользователей: 0)
Пользователей: 0




RSS Текстовая версия Сейчас: 3.1.2025, 11:27