Модераторы: Daevaorn
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> QItemDelegate, ошибка при обработке 
:(
    Опции темы
Platon
Дата 10.2.2007, 11:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1801
Регистрация: 25.4.2006

Репутация: нет
Всего: 40



Здравствуйте, уважаемые.

Возникла проблема в работе делегата, при нажатии на колонку, обрабатываемую моим делегатом выдается ошибка, в чем проблема?

Код

ManagerDelegate::ManagerDelegate(QObject *parent)
    : QItemDelegate(parent)
{

}

QWidget *ManagerDelegate::createEditor(QWidget *parent, const QStyleOptionViewItem &option,
                                       const QModelIndex &index) const 
{
    if (index.column() == 1) {
        StatusComboBox *st = new StatusComboBox(0);
        st->installEventFilter(const_cast<ManagerDelegate*>(this));
        return st;
    }
    return QItemDelegate::createEditor(parent, option, index);
}

void ManagerDelegate::setEditorData(QWidget *editor, const QModelIndex &index) const {
    if (index.column() == 1) {
        int value = index.model()->data(index, Qt::DisplayRole).toInt();
        StatusComboBox *st = static_cast<StatusComboBox*>(editor);
        if (st->currentIndex() != value)
            st->setCurrentIndex(value);
        return;
    }
    QItemDelegate::setEditorData(editor, index);
}
void ManagerDelegate::setModelData(QWidget *editor, QAbstractItemModel *model,
                  const QModelIndex &index) const 
{
    if (index.column() == 1) {
        StatusComboBox *st = static_cast<StatusComboBox*>(editor);
        int value = st->currentIndex();
        if (model->data(index).toInt() != value)
            model->setData(index, value);
        return;
    }
    QItemDelegate::setModelData(editor, model, index);
}

void ManagerDelegate::updateEditorGeometry(QWidget *editor,
                          const QStyleOptionViewItem &option, const QModelIndex &index) const
{
    editor->setGeometry(option.rect);
}


ManagerDelegate::~ManagerDelegate()
{

}


даже непонятно где ошибка хранится, но делал по стандатрту Qt примера.
и к сожалению, видимо эта комбобокс появляется только при ее редактировании, а как сделать чтоб она постоянно оставалась там.
PM MAIL ICQ   Вверх
Любитель
Дата 10.2.2007, 21:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Программист-романтик
****


Профиль
Группа: Комодератор
Сообщений: 3645
Регистрация: 21.5.2005
Где: Воронеж

Репутация: 24
Всего: 92



Всё таки не помешало бы знать - какая ошибка (не факт кстати, что она в делегате). Экзепшен или просто вылет. С дебаггером пройдись.

Несколько беглых замечаний по коду. 

1. Почему комбобокс без парента создаёшь? Кто его удалять будет?

2. 
Код

if (st->currentIndex() != value)
   st->setCurrentIndex(value);

мелочь, но подобную проверку должен выполнять метод setCurrentIndex. То же ниже.

Насчёт "постоянности" комбобокса. Ты ведь сейчас и делаешь именно редактирование. Есть три метода:

1. paint - метод делегата (переопрделение). Лучший в данном случае, пожалуй.
2. setIndexWidget - для простого отображение виджета, установив связку сигнал/слотов можно обеспечить вызов редактирования при изменения его значения. Наверно, самый простой.
3. Создание своих видов. Пожалуй, не тот случай. Кстати, ты какой вью используешь? Не уверен, но может понадобится  smile 


--------------------
PM MAIL ICQ Skype   Вверх
Platon
Дата 11.2.2007, 17:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1801
Регистрация: 25.4.2006

Репутация: нет
Всего: 40



Ооох, спасибо, пожалуй 2-й способ самый подходящий, все таки думаю, что пейнт для более экстравагантных обработок, а мне просто стандартный виджет в ячейку забить надо было.
PM MAIL ICQ   Вверх
Любитель
Дата 11.2.2007, 19:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Программист-романтик
****


Профиль
Группа: Комодератор
Сообщений: 3645
Регистрация: 21.5.2005
Где: Воронеж

Репутация: 24
Всего: 92



 smile Недоработки исправь


--------------------
PM MAIL ICQ Skype   Вверх
Platon
Дата 11.2.2007, 21:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1801
Регистрация: 25.4.2006

Репутация: нет
Всего: 40



Ok, уже учел.
PM MAIL ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0451 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.