crossplatform.ru

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

MishaUA
  опции профиля:
сообщение 7.1.2014, 4:49
Сообщение #1


Участник
**

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

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




Репутация:   0  


Делегаты использую крайне редко. Сейчас нужно в QTableView отображать в первой колонке выбор времени, во второй дни недели (7 галочек), в последней - еще одна галочка.
Вот часть кода:
#include "device_ink_dialog_timetable.h"
#include "../../MCU/Bits.h"

///////////// Model
///
DeviceInkDialogTimeTableModel::DeviceInkDialogTimeTableModel(QList<DeviceInkAutoActivatingSettings> *list_, QObject *parent) :
    QAbstractTableModel(parent)
{
    list = list_;
}

QVariant DeviceInkDialogTimeTableModel::data(const QModelIndex &index, int role) const
{
    if (!index.isValid() || (index.row() >= list->count()))  return QVariant();

    // для каждого столбца возвращаем нужные данные
    if (role == Qt::DisplayRole || role == Qt::EditRole){
        switch (index.column()) {
            case DeviceInkDialogTimeTable_COLLUMN__TIME: return list->at(index.row()).time;
            case DeviceInkDialogTimeTable_COLLUMN__DAY_OF_WEEK: return list->at(index.row()).dayOfWeek;
            case DeviceInkDialogTimeTable_COLLUMN__ENABLED: return list->at(index.row()).enabled;
        }

    }

    return QVariant();
}

bool DeviceInkDialogTimeTableModel::setData(const QModelIndex &index, const QVariant &value, int role)
{
    if (index.isValid() && role==Qt::EditRole) {
        switch (index.column()) {
            case DeviceInkDialogTimeTable_COLLUMN__TIME: list->operator[](index.row()).time = value.toTime(); break;
            case DeviceInkDialogTimeTable_COLLUMN__DAY_OF_WEEK: list->operator[](index.row()).dayOfWeek = value.toInt(); break;
            case DeviceInkDialogTimeTable_COLLUMN__ENABLED: list->operator[](index.row()).enabled = value.toBool(); break;
        }

        return true;
    }
    return false;
}

int DeviceInkDialogTimeTableModel::rowCount(const QModelIndex &parent) const
{
    return list->count();
}

int DeviceInkDialogTimeTableModel::columnCount(const QModelIndex &parent) const
{
    return 3;
}

QVariant DeviceInkDialogTimeTableModel::headerData(int section, Qt::Orientation orientation, int role) const
{
    if(role != Qt::DisplayRole) return QVariant();

    if(orientation == Qt::Horizontal && role == Qt::DisplayRole){
        switch (section) {
            case DeviceInkDialogTimeTable_COLLUMN__TIME: return tr("Time");
            case DeviceInkDialogTimeTable_COLLUMN__DAY_OF_WEEK: return tr("Days of week");
            case DeviceInkDialogTimeTable_COLLUMN__ENABLED: return tr("Enabled");
        }
    }else{
        return QString("%1").arg(section + 1); // возвращаем номера строк
    }
}

Qt::ItemFlags DeviceInkDialogTimeTableModel::flags(const QModelIndex &index) const
{
    if (!index.isValid()) return Qt::ItemIsEnabled;

    return QAbstractItemModel::flags(index) | Qt::ItemIsEditable;
}


////////////// Delegate
///
DeviceInkDialogTimeTableDelegate::DeviceInkDialogTimeTableDelegate(QObject *parent) :
    QItemDelegate(parent)
{

}

QWidget *DeviceInkDialogTimeTableDelegate::createEditor(QWidget *parent, const QStyleOptionViewItem &option, const QModelIndex &index) const
{
    switch (index.column()) {
        case DeviceInkDialogTimeTable_COLLUMN__TIME: {
            QTimeEdit *editor = new QTimeEdit(parent);
            editor->setDisplayFormat("HH:mm:ss");
            return editor;
        } break;
        case DeviceInkDialogTimeTable_COLLUMN__DAY_OF_WEEK: {
            DeviceInkDialogTimeTableDelegateDaysBoxes* editor = new DeviceInkDialogTimeTableDelegateDaysBoxes(parent);
            return editor;
        } break;
        case DeviceInkDialogTimeTable_COLLUMN__ENABLED: {
            QCheckBox* editor = new QCheckBox(parent);
            return editor;
        } break;
    }
}

void DeviceInkDialogTimeTableDelegate::setEditorData(QWidget *editor, const QModelIndex &index) const
{
    switch (index.column()) {
        case DeviceInkDialogTimeTable_COLLUMN__TIME: {
            QTimeEdit *e = qobject_cast<QTimeEdit*>(editor);
            if (e)
                e->setTime(index.model()->data(index, Qt::EditRole).toTime());
        } break;
        case DeviceInkDialogTimeTable_COLLUMN__DAY_OF_WEEK: {
            DeviceInkDialogTimeTableDelegateDaysBoxes *e = qobject_cast<DeviceInkDialogTimeTableDelegateDaysBoxes*>(editor);
            if (e) {
                int    v = index.model()->data(index, Qt::EditRole).toInt();
                for (int i=0; i<7; i++) e->box[i]->setChecked(CheckBit(v, i));
            }
        } break;
        case DeviceInkDialogTimeTable_COLLUMN__ENABLED: {
            QCheckBox *e = qobject_cast<QCheckBox*>(editor);
            if (e)
                e->setChecked(index.model()->data(index, Qt::EditRole).toBool());
        } break;
    }
}

void DeviceInkDialogTimeTableDelegate::setModelData(QWidget *editor, QAbstractItemModel *model, const QModelIndex &index) const
{
    switch (index.column()) {
        case DeviceInkDialogTimeTable_COLLUMN__TIME: {
            QTimeEdit *e = qobject_cast<QTimeEdit*>(editor);
            if (e)
                model->setData(index, e->time());
            e->setTime(index.model()->data(index, Qt::EditRole).toTime());
        } break;
        case DeviceInkDialogTimeTable_COLLUMN__DAY_OF_WEEK: {
            DeviceInkDialogTimeTableDelegateDaysBoxes *e = qobject_cast<DeviceInkDialogTimeTableDelegateDaysBoxes*>(editor);
            if (e) {
                int    v;
                for (int i=0; i<7; i++) set_bit(v, i, e->box[i]->isChecked());
                model->setData(index, v);
            }
        } break;
        case DeviceInkDialogTimeTable_COLLUMN__ENABLED: {
            QCheckBox *e = qobject_cast<QCheckBox*>(editor);
            if (e)
                model->setData(index, e->isChecked());
        } break;
    }
}

void DeviceInkDialogTimeTableDelegate::updateEditorGeometry(QWidget *editor, const QStyleOptionViewItem &option, const QModelIndex &index) const
{
    // устанавливаем расположение
    editor->setGeometry(option.rect);
}

void DeviceInkDialogTimeTableDelegate::paint(QPainter *painter, const QStyleOptionViewItem &option, const QModelIndex &index) const
{
    switch (index.column()) {
        case DeviceInkDialogTimeTable_COLLUMN__TIME: {

        } break;
        case DeviceInkDialogTimeTable_COLLUMN__DAY_OF_WEEK: {

        } break;
        case DeviceInkDialogTimeTable_COLLUMN__ENABLED: {

        } break;
    }
}

QSize DeviceInkDialogTimeTableDelegate::sizeHint(const QStyleOptionViewItem &option, const QModelIndex &index) const
{
    int width = 100;

    switch (index.column()) {
        case DeviceInkDialogTimeTable_COLLUMN__TIME: width = 50; break;
        case DeviceInkDialogTimeTable_COLLUMN__DAY_OF_WEEK: width = 150; break;
        case DeviceInkDialogTimeTable_COLLUMN__ENABLED: width = 50; break;
    }

    return QSize(width, 70);
}

Проблема в том, что редактор (QTimeEdit, DeviceInkDialogTimeTableDelegateDaysBoxes и QcheckBox) отображается только после двойного клика по ячейке. Собственно, интересует, как сделать так, чтобы он отображался постоянно?
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
 
Начать новую тему
Ответов
Litkevich Yuriy
  опции профиля:
сообщение 9.1.2014, 2:47
Сообщение #2


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

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

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




Репутация:   94  


тебе редактор как таковой может и не нужен (см. приведённый мною пример), всю работу по смене состояний и обновлении модели можно делать в обработчике события editorEvent

П.С.
Можно было не делать столь длинных имён: DeviceInkDialogTimeTable_COLLUMN__TIME
достаточно было "спрятать" их внутри класса:
class DeviceInkDialogTimeTableDelegate
{
...
enum Columns {
    COLLUMN_TIME = 1,
    COLLUMN_DAY_OF_WEEK,
    COLLUMN_ENABLED
}
...
}
Ну а в коде делегата использовать:
 case COLLUMN_DAY_OF_WEEK:
 ...
За пределами же делегата, использовать с указанием класса:
case DeviceInkDialogTimeTableDelegate::COLLUMN_DAY_OF_WEEK:
...
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

Сообщений в этой теме


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


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


RSS Рейтинг@Mail.ru Текстовая версия Сейчас: 23.7.2025, 9:58