Вот часть кода:
#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) отображается только после двойного клика по ячейке. Собственно, интересует, как сделать так, чтобы он отображался постоянно?