Здравствуйте, у меня есть делегат- QTimeEdit, я делегирую его в QTableWidget, фактически за основу я взял делегат QSpinBox'a из примеров Qt, и изменил то что мне надо, но выскакивают ошибки, я меняю код, и ошибки меняются
Вот сам код
delegate.h
#ifndef DELEGATE_H
#define DELEGATE_H
#include <QItemDelegate>
#include <QModelIndex>
#include <QObject>
#include <QSize>
#include <QSpinBox>
//! [0]
class TimeEditDelegate : public QItemDelegate
{
Q_OBJECT
public:
TimeEditDelegate(QObject *parent = 0);
QTime * value;
QWidget *createEditor(QWidget *parent, const QStyleOptionViewItem &option,
const QModelIndex &index) const;
void setEditorData(QWidget *editor, const QModelIndex &index) const;
void setModelData(QWidget *editor, QAbstractItemModel *model,
const QModelIndex &index) const;
void updateEditorGeometry(QWidget *editor,
const QStyleOptionViewItem &option, const QModelIndex &index) const;
};
//! [0]
#endif
#include <QtGui>
#include "delegate.h"
//! [0]
TimeEditDelegate::TimeEditDelegate(QObject *parent)
: QItemDelegate(parent)
{
}
//! [0]
//! [1]
QWidget *TimeEditDelegate::createEditor(QWidget *parent,
const QStyleOptionViewItem &/* option */,
const QModelIndex &/* index */) const
{
QTimeEdit *editor = new QTimeEdit(parent);
return editor;
}
//! [1]
//! [2]
void TimeEditDelegate::setEditorData(QWidget *editor,
const QModelIndex &index) const
{
* value = index.model()->data(index, Qt::EditRole).toTime();
QTimeEdit *timeEdit = static_cast<QTimeEdit*>(editor);
timeEdit->setTime(* value);
}
//! [2]
//! [3]
void TimeEditDelegate::setModelData(QWidget *editor, QAbstractItemModel *model,
const QModelIndex &index) const
{
QTimeEdit *timeEdit = static_cast<QTimeEdit*>(editor);
timeEdit->interpretText();
* value = timeEdit->time();
model->setData(index, value , Qt::EditRole);
}
//! [3]
//! [4]
void TimeEditDelegate::updateEditorGeometry(QWidget *editor,
const QStyleOptionViewItem &option, const QModelIndex &/* index */) const
{
editor->setGeometry(option.rect);
}
//! [4]
Ты изменяешь член "value" в константных методах, которые потому и константные, что не должны ничего изменять.
А исправьте пожалуйста, как правильно
Гость_Hepr_*, а он тебе как член класса и не нужен. Ты его всё равно всякий раз внутри функции изменяешь и используешь, дак и сделай его локальной переменной функции.
П.С.
И делать его указателем тоже ни к чему, т.к. используется только по значению.
Переименуй value.
Здравствуйте, теперь все компилируется нормально, проект запускается, но как только я хочу вызвать делегат выдает ошибку(Нарушение прав доступа при чтении), я понимаю чем это может быть вызвано(обращение не к публичной функции вне класса и тп), но где именно в коде может провоцироваться ошибка, я так и не нашел, помогите пожалуйста
delegate.h
#ifndef DELEGATE_H
#define DELEGATE_H
#include <QItemDelegate>
#include <QModelIndex>
#include <QObject>
#include <QSize>
#include <QSpinBox>
//! [0]
class TimeEditDelegate : public QItemDelegate
{
Q_OBJECT
public:
TimeEditDelegate(QObject *parent = 0);
QTime * val;
QWidget *createEditor(QWidget *parent, const QStyleOptionViewItem &option,
const QModelIndex &index) const;
void setEditorData(QWidget *editor, const QModelIndex &index) const;
void setModelData(QWidget *editor, QAbstractItemModel *model,
const QModelIndex &index) const;
void updateEditorGeometry(QWidget *editor,
const QStyleOptionViewItem &option, const QModelIndex &index) const;
};
//! [0]
#endif
#include <QtGui>
#include "delegate.h"
//! [0]
TimeEditDelegate::TimeEditDelegate(QObject *parent)
: QItemDelegate(parent)
{
}
//! [0]
//! [1]
QWidget *TimeEditDelegate::createEditor(QWidget *parent,
const QStyleOptionViewItem &/* option */,
const QModelIndex &/* index */) const
{
QTimeEdit *editor = new QTimeEdit(parent);
return editor;
}
//! [1]
//! [2]
void TimeEditDelegate::setEditorData(QWidget *editor,
const QModelIndex &index) const
{
* val = index.model()->data(index, Qt::EditRole).toTime();
QTimeEdit *timeEdit = static_cast<QTimeEdit*>(editor);
timeEdit->setTime(* val);
}
//! [2]
//! [3]
void TimeEditDelegate::setModelData(QWidget *editor, QAbstractItemModel *model,
const QModelIndex &index) const
{
QTimeEdit *timeEdit = static_cast<QTimeEdit*>(editor);
timeEdit->interpretText();
* val = timeEdit->time();
// model->setData(index, value , Qt::EditRole);
}
//! [3]
//! [4]
void TimeEditDelegate::updateEditorGeometry(QWidget *editor,
const QStyleOptionViewItem &option, const QModelIndex &/* index */) const
{
editor->setGeometry(option.rect);
}
//! [4]
#include <QApplication>
#include <QHeaderView>
#include <QItemSelectionModel>
#include <QStandardItemModel>
#include <QTableView>
#include "delegate.h"
//! [0]
int main(int argc, char *argv[])
{
QApplication app(argc, argv);
QStandardItemModel model(4, 2);
QTableView tableView;
tableView.setModel(&model);
TimeEditDelegate delegate;
tableView.setItemDelegate(&delegate);
//! [0]
tableView.horizontalHeader()->setStretchLastSection(true);
//! [1]
for (int row = 0; row < 4; ++row) {
for (int column = 0; column < 2; ++column) {
QModelIndex index = model.index(row, column, QModelIndex());
model.setData(index, QVariant((row+1) * (column+1)));
}
//! [1] //! [2]
}
//! [2]
//! [3]
tableView.setWindowTitle(QObject::tr("Spin Box Delegate"));
tableView.show();
return app.exec();
}
//! [3]
рррррр..
В посте номер 1 такой код:
void TimeEditDelegate::setEditorData(QWidget *editor,
const QModelIndex &index) const
{
* value = index.model()->data(index, Qt::EditRole).toTime();
QTimeEdit *timeEdit = static_cast<QTimeEdit*>(editor);
timeEdit->setTime(* value);
}
void TimeEditDelegate::setEditorData(QWidget *editor,
const QModelIndex &index) const
{
* val = index.model()->data(index, Qt::EditRole).toTime();
QTimeEdit *timeEdit = static_cast<QTimeEdit*>(editor);
timeEdit->setTime(* val);
}
void TimeEditDelegate::setEditorData(QWidget *editor,
const QModelIndex &index) const
{
* value = index.model()->data(index, Qt::EditRole).toTime();
QTimeEdit *timeEdit = static_cast<QTimeEdit*>(editor);
timeEdit->setTime(* value);
}
void TimeEditDelegate::setEditorData(QWidget *editor,
const QModelIndex &index) const
{
* val = index.model()->data(index, Qt::EditRole).toTime();
QTimeEdit *timeEdit = static_cast<QTimeEdit*>(editor);
timeEdit->setTime(* val);
}
1. Вижу объявление указателя на класс QTime * val;
А вот где выделяется память под объект класса не увидел. Если здесь охота работать именно с указателями, нужно в конструкторе написать:
QTime * val = new QTime(...);
QTimeEdit *editor = new QTimeEdit(parent);
return editor;
return new QTimeEdit(parent);
* val = index.model()->data(index, Qt::EditRole).toTime();
QTimeEdit *timeEdit = static_cast<QTimeEdit*>(editor);
timeEdit->setTime(* val);
QTimeEdit *timeEdit = static_cast<QTimeEdit*>(editor);
if (timeEdit) timeEdit->setTime(index.model()->data(index, Qt::EditRole).toTime());
QTime * val = new QTime(...);
QTimeEdit *editor = new QTimeEdit(parent);
return editor;
return new QTimeEdit(parent);
* val = index.model()->data(index, Qt::EditRole).toTime();
QTimeEdit *timeEdit = static_cast<QTimeEdit*>(editor);
timeEdit->setTime(* val);
QTimeEdit *timeEdit = static_cast<QTimeEdit*>(editor);
if (timeEdit) timeEdit->setTime(index.model()->data(index, Qt::EditRole).toTime());
Что бы не открывать новой темы, позвольте задать в этой еще 1 вопрос, как я понимаю значение в ячейке таблицы, по умолчанию имеет тип int, а как можно его переделать в QTime, а то после того как я в делегате, выставлю время, она не сохраняется, там так и остается, то значение в int, что и было
Форум Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)