crossplatform.ru

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

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





Гости








    


Здравствуйте, у меня есть делегат- QTimeEdit, я делегирую его в QTableWidget, фактически за основу я взял делегат QSpinBox'a из примеров Qt, и изменил то что мне надо, но выскакивают ошибки, я меняю код, и ошибки меняются :o:
Вот сам код
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

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
{
    * 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]

Скажите пожалуйста, что я делаю неправильно, и объясните как правильно, если не трудно
Вот, какая ошибка выскакивает сейчас

Ошибка 1 error C2248: QVariant::QVariant: невозможно обратиться к private член, объявленному в классе "QVariant" c:\Documents and Settings\hepr\Мои документы\Visual Studio 2008\Projects\asd\asd\delegets\delegate.cpp 87
Заранее спасибо!
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
xls
  опции профиля:
сообщение 20.2.2011, 16:53
Сообщение #2


Студент
*

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

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




Репутация:   2  


Ты изменяешь член "value" в константных методах, которые потому и константные, что не должны ничего изменять.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Гость_Hepr_*
сообщение 20.2.2011, 17:25
Сообщение #3





Гости








    


А исправьте пожалуйста, как правильно
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Litkevich Yuriy
  опции профиля:
сообщение 20.2.2011, 20:48
Сообщение #4


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

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

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




Репутация:   94  


Гость_Hepr_*, а он тебе как член класса и не нужен. Ты его всё равно всякий раз внутри функции изменяешь и используешь, дак и сделай его локальной переменной функции.

П.С.
И делать его указателем тоже ни к чему, т.к. используется только по значению.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Гость_Hepr_*
сообщение 20.2.2011, 22:23
Сообщение #5





Гости








    


Цитата(Litkevich Yuriy @ 20.2.2011, 20:48) *
Гость_Hepr_*, а он тебе как член класса и не нужен. Ты его всё равно всякий раз внутри функции изменяешь и используешь, дак и сделай его локальной переменной функции.

П.С.
И делать его указателем тоже ни к чему, т.к. используется только по значению.

Это я понимаю, и делаю это для удобства(когда будет работать нормально исправлю), но ошибка возникает, согласитесь не по-этому
Ошибка возникает тут: model->setData(index, value , Qt::EditRole);
А именно на Qt::EditRole, но почему я не понимаю(
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Rocky
  опции профиля:
сообщение 20.2.2011, 22:27
Сообщение #6


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

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

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




Репутация:   7  


Цитата(Гость_Hepr_* @ 20.2.2011, 22:23) *
Ошибка возникает тут: model->setData(index, value , Qt::EditRole);
А именно на Qt::EditRole, но почему я не понимаю(



Цитата(Гость_Hepr_* @ 20.2.2011, 15:21) *
Ошибка 1 error C2248: QVariant::QVariant: невозможно обратиться к private член, объявленному в классе "QVariant" c:\Documents and Settings\hepr\Мои документы\Visual Studio 2008\Projects\asd\asd\delegets\delegate.cpp 87


Где тут написано, что ошибка возникает на Qt::EditRole?
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
xls
  опции профиля:
сообщение 20.2.2011, 23:15
Сообщение #7


Студент
*

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

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




Репутация:   2  


Переименуй value.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Гость_hepr_*
сообщение 20.2.2011, 23:17
Сообщение #8





Гости








    


Цитата(Rocky @ 20.2.2011, 22:27) *
Цитата(Гость_Hepr_* @ 20.2.2011, 22:23) *
Ошибка возникает тут: model->setData(index, value , Qt::EditRole);
А именно на Qt::EditRole, но почему я не понимаю(



Цитата(Гость_Hepr_* @ 20.2.2011, 15:21) *
Ошибка 1 error C2248: QVariant::QVariant: невозможно обратиться к private член, объявленному в классе "QVariant" c:\Documents and Settings\hepr\Мои документы\Visual Studio 2008\Projects\asd\asd\delegets\delegate.cpp 87


Где тут написано, что ошибка возникает на Qt::EditRole?

Во всяком случае VS мне указывает именно на эту строку
P.S. я разбил model->setData(index, value , Qt::EditRole);
на
model->setData(index,
value ,
Qt::EditRole); // и показало что ошибка в этой строке
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Гость_Hepr_*
сообщение 20.2.2011, 23:28
Сообщение #9





Гости








    


Цитата
Переименуй value.

И вправду помогло, а не объясните в чем было проблема, дайте угадаю это была какая-то системная переменная или тп?
А не подскажите как теперь установить делегат в QTableWidget, нужный item(а точнее в column)
P.S. огромное спасибо за помощь, без вас я бы вряд ли сам понял, где собака зарыта
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Litkevich Yuriy
  опции профиля:
сообщение 21.2.2011, 11:13
Сообщение #10


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

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

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




Репутация:   94  


Цитата(Гость_hepr_* @ 21.2.2011, 1:17) *
Qt::EditRole); // и показало что ошибка в этой строке
он просто показал на конец оператора. Си/Си++ компилятор не в силах определить место в строке, только саму строку.

можешь для эксперимента закрывающуюся скобку перенести на другую строку
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

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


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




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