crossplatform.ru

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

2 страниц V  < 1 2  
Ответить в данную темуНачать новую тему
> Помогите с делегатом, Подправьте пожалуйста делегат, а то я совсем запутался(
Гость_Hepr_*
сообщение 21.2.2011, 16:14
Сообщение #11





Гости








    


Здравствуйте, теперь все компилируется нормально, проект запускается, но как только я хочу вызвать делегат выдает ошибку(Нарушение прав доступа при чтении), я понимаю чем это может быть вызвано(обращение не к публичной функции вне класса и тп), но где именно в коде может провоцироваться ошибка, я так и не нашел, помогите пожалуйста
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

delegate.cpp
#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]

main.cpp
#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]

P.S. заранее огромное спасибо, за потраченное время
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Rocky
  опции профиля:
сообщение 21.2.2011, 17:02
Сообщение #12


Старейший участник
****

Группа: Участник
Сообщений: 530
Регистрация: 22.12.2008
Из: Санкт-Петербург
Пользователь №: 463

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




Репутация:   7  


рррррр..
В посте номер 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);
}


В посте номер 11:
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);
}


Т.е. воспринято было буквально, value заменен на val. Я бы посоветовал пойти почитать для начала любую книгу "С++ для начинающих" и т.п. В частности что такое указатели, для чего они, как с ними работать и пр. и пр. Иначе код такой потом получится что мама не горюй.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Гость_Hepr_*
сообщение 21.2.2011, 17:56
Сообщение #13





Гости








    


Цитата(Rocky @ 21.2.2011, 17:02) *
рррррр..
В посте номер 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);
}


В посте номер 11:
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);
}


Т.е. воспринято было буквально, value заменен на val. Я бы посоветовал пойти почитать для начала любую книгу "С++ для начинающих" и т.п. В частности что такое указатели, для чего они, как с ними работать и пр. и пр. Иначе код такой потом получится что мама не горюй.

Я как раз после такой книги, и ни смотря на то что я буквально понял подсказку-ошибки больше не выдавалось, и текст начал компилироваться нормально,
И я вроде неплохо варю С++(насколько это возможно для новичка), что такое указатели и как их использовать знаю, просто я Qt совсем не давно начал изучать вот и часто глупости пишу, и все-таки не могли бы подсказать где ошибка, а лучше тыкнуть носом, а то я совсем запутался :mellow:
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Rocky
  опции профиля:
сообщение 21.2.2011, 18:06
Сообщение #14


Старейший участник
****

Группа: Участник
Сообщений: 530
Регистрация: 22.12.2008
Из: Санкт-Петербург
Пользователь №: 463

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




Репутация:   7  


1. Вижу объявление указателя на класс QTime * val;
А вот где выделяется память под объект класса не увидел. Если здесь охота работать именно с указателями, нужно в конструкторе написать:
QTime * val = new QTime(...);

И потом уже использовать val (*val).

2. Нет никакой необходимости делать переменную член класса QTime * val общедоступной.
3. Нет никакой необходимости вообще использовать переменную-член QTime * val.
4. Нет никакой необходимости использовать переменную QTime * val как указатель (достаточно либо самого объекта, либо константной ссылки на него - в данном случае).
5. Многие куски кода можно переписать так:
    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());

и т.д.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Гость_Hepr_*
сообщение 21.2.2011, 18:36
Сообщение #15





Гости








    


Цитата(Rocky @ 21.2.2011, 18:06) *
1. Вижу объявление указателя на класс QTime * val;
А вот где выделяется память под объект класса не увидел. Если здесь охота работать именно с указателями, нужно в конструкторе написать:
QTime * val = new QTime(...);

И потом уже использовать val (*val).

2. Нет никакой необходимости делать переменную член класса QTime * val общедоступной.
3. Нет никакой необходимости вообще использовать переменную-член QTime * val.
4. Нет никакой необходимости использовать переменную QTime * val как указатель (достаточно либо самого объекта, либо константной ссылки на него - в данном случае).
5. Многие куски кода можно переписать так:
    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());

и т.д.

Спасибо большое, блин искал в ассистенте что делают те или иные функции, классы, а сам память забыл в конструкторе выделить, спасибо большое
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Гость_Hepr_*
сообщение 21.2.2011, 22:35
Сообщение #16





Гости








    


Что бы не открывать новой темы, позвольте задать в этой еще 1 вопрос, как я понимаю значение в ячейке таблицы, по умолчанию имеет тип int, а как можно его переделать в QTime, а то после того как я в делегате, выставлю время, она не сохраняется, там так и остается, то значение в int, что и было
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Алексей1153
  опции профиля:
сообщение 3.3.2011, 9:04
Сообщение #17


фрилансер
******

Группа: Участник
Сообщений: 2941
Регистрация: 19.6.2010
Из: Обливион
Пользователь №: 1822

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




Репутация:   34  


Цитата(Гость_Hepr_* @ 21.2.2011, 18:14) *
//! [0]
TimeEditDelegate::TimeEditDelegate(QObject *parent)
: QItemDelegate(parent)
{
}
//! [0]


кстати! А что вот эта штучка обозначает - "//! [0]" ? :)
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

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


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




RSS Текстовая версия Сейчас: 29.11.2024, 20:59