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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: Редактируемый CheckBox в TableView  (Прочитано 7792 раз)
radislav72
Гость
« : Август 10, 2012, 19:45 »

Здравствуйте!

Есть TableView, в который при использовании QSqlQueryModel выбираются данные из БД:
Код:
    model = new QSqlQueryModel(this);

    QSqlQuery q;
    q.prepare("SELECT id, descr, stdop FROM finance.contr_operations ORDER BY gr_id, sort_order");
    q.exec();

    model->setQuery(q);

    ui->tabv->setItemDelegate(new CheckBoxDelegate(ui->tabv, 2));
    ui->tabv->setModel(model);
Надо сделать так, чтоб:
1. Вместо 1 / 0 в последнем столбце отображались чекбоксы
2. Чтобы двойным кликаньем на ячейке с чекбоксом можно было перейти в режим редактирования, изменить состояние чекбокса, и в конце редактирования обновить данные в БД.

Пробую сделать так через делегат:
Код:
CheckBoxDelegate::CheckBoxDelegate(QObject *parent, int checkColumnIx) :
    QItemDelegate(parent)
{
    checkBoxColumnIx = checkColumnIx;
}

QWidget *CheckBoxDelegate::createEditor(QWidget* parent, const QStyleOptionViewItem &option,
                      const QModelIndex &index) const
{
    if (index.column() == checkBoxColumnIx)
    {
        QCheckBox* chb = new QCheckBox(parent);
        connect(chb, SIGNAL(toggled(bool)), this, SLOT(commitAndCloseEditor()));
        return chb;
    } else {
        return QItemDelegate::createEditor(parent, option, index);
    }
}

void CheckBoxDelegate::setEditorData(QWidget *editor, const QModelIndex &index) const
{
    if (index.column() == checkBoxColumnIx)
    {
        int checked = index.model()->data(index, Qt::DisplayRole).toInt();
        QCheckBox* chb = qobject_cast<QCheckBox*>(editor);
        chb->setChecked(checked == 1);
    } else {
        QItemDelegate::setEditorData(editor, index);
    }
}

void CheckBoxDelegate::setModelData(QWidget *editor, QAbstractItemModel *model, const QModelIndex &index) const
{
    if (index.column() == checkBoxColumnIx)
    {

    } else {
        QItemDelegate::setModelData(editor, model, index);
    }
}

void CheckBoxDelegate::commitAndCloseEditor()
{
    QCheckBox* editor = qobject_cast<QCheckBox*>(sender());
    emit commitData(editor);
    emit closeEditor(editor);
}

void CheckBoxDelegate::updateEditorGeometry(QWidget *editor,
    const QStyleOptionViewItem &option, const QModelIndex & index ) const
{
    editor->setGeometry(option.rect);
}

Сам делегат устанавливается в первом куске кода. Хотя пример взял из Exampl'ов Qt, но что-то ничего не работает- то-есть, в TableView дальше 1 / 0 вместо чекбоксов. А при установке breakpoint в createEditor ни разу точка останова не сработала.

Подскажите, что не так?
Записан
radislav72
Гость
« Ответ #1 : Август 11, 2012, 09:28 »

Так, почему чекбоксов не было, разобрался: надо было еще метод paint написать:
Код:
void CheckBoxDelegate::paint(QPainter * painter, const QStyleOptionViewItem &option,
                          const QModelIndex &index) const
{
    if (index.column() == checkBoxColumnIx)
    {
        QWidget *w = dynamic_cast<QWidget *>(painter->device());
        if (w)
        {
            QItemDelegate::drawBackground( painter, option, index );
            QItemDelegate::drawCheck( painter, option, option.rect, index.data(Qt::EditRole).toBool() ? Qt::Checked : Qt::Unchecked );
            drawFocus(painter, option, option.rect);
        }
    } else {
        QItemDelegate::paint(painter, option, index);
    }
}

Но TableView в режим редактирования так и не переходит. Насколько я понимаю, он автоматически должен при двойном кликанье перейти в режим редактирования? И должен сработать метод createEditor, но он никогда ни при каких условиях не срабатывает...
Записан
Странник
Гость
« Ответ #2 : Август 11, 2012, 09:44 »

QSqlQueryModel только для чтения, соответственно не возвращает флаг Qt::ItemIsEditable. надо думать, поэтому и не открывается ваш делегат в режиме редактирования. либо используйте QSqlTableModel, либо наследуйтесь и реализуйте редактирование самостоятельно.
Записан
radislav72
Гость
« Ответ #3 : Август 11, 2012, 10:44 »

Спасибо за ответ...
Заменил QSqlQueryModel на QTableModel, но при двойном клике все равно режим редактирования не включается. И createEditor не срабатывает (:
Записан
Странник
Гость
« Ответ #4 : Август 11, 2012, 11:39 »

EditTriggers для QTableView установлены?
Записан
radislav72
Гость
« Ответ #5 : Август 11, 2012, 11:52 »

Да, прямо в коде даже прописал:
Код:
ui->tabv->setEditTriggers(QAbstractItemView::DoubleClicked);
Записан
radislav72
Гость
« Ответ #6 : Август 11, 2012, 12:15 »

Или тут и модель нужно свою создать?
Записан
aasavelev
Гость
« Ответ #7 : Февраль 07, 2015, 17:35 »

У тебя как-нибудь получилось добиться редактирования CheckBox?
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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