Russian Qt Forum
Сентябрь 30, 2024, 18:39 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: [Решено] Проверка заполненности строки  (Прочитано 2675 раз)
voral
Гость
« : Октябрь 30, 2010, 19:08 »

Что то меня совсем заклинило.
Итак имею
QTableView+QStandardItemModel
Для колонок установлены делегаты.
Ввод новых строк осуществляется следующим образом: по нажатию спецклавиши добавляется новая строка с пустыми значениямив ячейках. Курсор перемещается на первую ячейку этой строки

Задача предотвратить создание пустых строк. Т.е. если пользователь ни чего не ввел и ушел с нее, то строка удаляется.
Т.к. QTableView у меня не чистый, а мой класс currentRowChanged ( const QModelIndex & current, const QModelIndex & previous )
после этого если уйти на другую строку то пустая удаляется.
Но. Если уйти на другой виджет мышью то строка остается.

Переопределил focusOutEvent(QFocusEvent *e)
Уходим на другой виджет. все ок. удаляется.

Но делегат тоже "другой" виджет. Т.е как только я щелкаю чтобы отредактировать (вызываю делегат) строка сразу удаляется....

Подскажите как решить задачу. Может я уже не в те дебри полез?


« Последнее редактирование: Ноябрь 01, 2010, 12:10 от voral » Записан
alexman
Гость
« Ответ #1 : Октябрь 30, 2010, 21:33 »

Может по нажатию на спецклавишу показывать диалог с полями для ввода, кнопкой ОK, кнопкой Cancel и там проверять валидность данных... Если не хочешь добавлять, то Cancel...
Записан
voral
Гость
« Ответ #2 : Ноябрь 01, 2010, 12:09 »

Может по нажатию на спецклавишу показывать диалог с полями для ввода, кнопкой ОK, кнопкой Cancel и там проверять валидность данных... Если не хочешь добавлять, то Cancel...
Это не всегда "красиво"
Итак нашел решение:
1. При создании объекта делегата в качестве родителя даю объект QTableView
Делегат (только значимые для решения моменты):
Код
C++ (Qt)
class VLineEditDelegate : public QStyledItemDelegate
{
public:
void setEditorData(QWidget *editor, const QModelIndex &index) const;
void setModelData(QWidget *editor, QAbstractItemModel *model, const QModelIndex &index) const;
};
 
void VLineEditDelegate::setEditorData(QWidget *editor, const QModelIndex &index) const
{
this->parent()->setObjectName("EDTIN");
...
}
 
void VLineEditDelegate::setModelData(QWidget *editor, QAbstractItemModel *model, const QModelIndex &index) const
{
this->parent()->setObjectName("");
...
}
 
Представление (только значимые для решения моменты):
Код
C++ (Qt)
class VTableView : public QTableView
{
Q_OBJECT
protected:
void focusOutEvent(QFocusEvent *e);
void closeEditor ( QWidget * editor, QAbstractItemDelegate::EndEditHint hint);
public:
explicit VTableView(QStandardItemModel *model, QWidget *parent = 0);
void setItemDelegateForColumnSG(int col,QStyledItemDelegate *delegate);
void itemAddCols();
bool dontCheck;
private slots:
void currentRowChanged ( const QModelIndex & current, const QModelIndex & previous );
void checkEmpty(const QModelIndex & itemIndex,bool selfFocusCheck=false);
};
 
VTableView::VTableView(QStandardItemModel *model, QWidget *parent) :
QTableView(parent)
{
this->dontCheck=true;
}
void VTableView::focusOutEvent(QFocusEvent *e)
{
if (this->objectName()!="EDTIN") this->checkEmpty(this->currentIndex());
QTableView::focusOutEvent(e);
}
void VTableView::currentRowChanged ( const QModelIndex & current, const QModelIndex & previous )
{
if (previous.row()!=current.row())
{
if (previous.row()>=0) this->checkEmpty(previous);
....
}
QTableView::currentChanged (current, previous);
}
void VTableView::setItemDelegateForColumnSG(int col,QStyledItemDelegate *delegate)
{
if (col>=this->model()->columnCount()) return;
delegate->setParent(this);
this->setItemDelegateForColumn(col,delegate);
}
void VTableView::checkEmpty(const QModelIndex & itemIndex,bool selfFocusCheck)
{
if (this->dontCheck) return;
if (selfFocusCheck&&this->hasFocus()) return;
if (!itemIndex.isValid()) return;
if (itemIndex.row()>=0)
{
bool isFull = true;
for (register int i=0;i<this->fields.count();i++)
{
QStandardItemModel *model = dynamic_cast<QStandardItemModel *>(this->model());
isFull = //проверка заполненности
}
if (!isFull) {
this->dontCheck=true;
this->model()->removeRow(itemIndex.row(),itemIndex.parent());
this->dontCheck=false;
}
}
}
void VTableView::itemAddCols()
{
this->dontCheck=true;
QList<QStandardItem *> row;
QStandardItemModel * model = qobject_cast<QStandardItemModel *>(this->model());
for(register int i=0;i<model->columnCount();++i)
{
QStandardItem *field = new QStandardItem("");
field->setEditable(true);
row.append(field);
}
model->appendRow(row);
this->dontCheck=false;
}
void VTableView::closeEditor ( QWidget * editor, QAbstractItemDelegate::EndEditHint hint)
{
this->checkEmpty(this->currentIndex(),true);
this->setObjectName("");
QTableView::closeEditor(editor,hint);
}
 
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.093 секунд. Запросов: 20.