Russian Qt Forum

Qt => Пользовательский интерфейс (GUI) => Тема начата: Nemo2000 от Ноября 18, 2010, 20:36



Название: [Решено]Работа с QCalendarWidget в QItemDelegate
Отправлено: Nemo2000 от Ноября 18, 2010, 20:36
Доброго времени суток=)
У меня есть таблица QTableWidget. Для её ячеек я создаю делегат ItemComboDateDelegate, чтобы редактировать ячейки с помощью календаря QCalendarWidget.

Код файла itemcombodatedelegate.cpp
Код:
#include "itemcombodatedelegate.h"
#include <QComboBox>
#include <QDebug>
#include <QCheckBox>
#include <QCalendarWidget>

ItemComboDateDelegate::ItemComboDateDelegate(QObject *parent) :
    QItemDelegate(parent)
{
}
QWidget *ItemComboDateDelegate::createEditor(QWidget *parent, const QStyleOptionViewItem &option,
                                      const QModelIndex &index) const
{
    qDebug()<<"createEditor";
    QCalendarWidget *calendar=new QCalendarWidget(parent);
    return calendar;
}

void ItemComboDateDelegate::updateEditorGeometry(QWidget *editor, const QStyleOptionViewItem &option,
                                           const QModelIndex &index) const
{
    qDebug()<<"setGeometry";
}

void ItemComboDateDelegate::setModelData(QWidget *editor, QAbstractItemModel *model, const QModelIndex &index) const
{
    qDebug()<<"setModelData";
    QCalendarWidget *calendar = static_cast<QCalendarWidget*>(editor);
    QDate value = calendar->selectedDate();
    model->setData(index,value,Qt::EditRole);
}

Мне нужно чтобы при клике на календарь, он тут же исчезал и нужное значение записывалось в ячейку.
У меня же это происходит только когда я кликаю по другой ячейке таблицы.

Я так понимаю что надо как-то отлавливать событие клика по календарю и в нём уже делать всё что нужно??словить клик, я могу, но как реализовать остальное?
Помогите, пожалуйста=)


Название: Re: Работа с QCalendarWidget в QItemDelegate
Отправлено: Пантер от Ноября 18, 2010, 20:38
Соедини его сигнал void   activated ( const QDate & date ) с его же слотом close и будет тебе счастье. ;)


Название: Re: Работа с QCalendarWidget в QItemDelegate
Отправлено: Nemo2000 от Ноября 18, 2010, 20:47
Я вот тоже думал так сделать,но почему-то такого слота там нету..  ???
есть только deleteLater() и helpEvent(); >:(


Название: Re: Работа с QCalendarWidget в QItemDelegate
Отправлено: Пантер от Ноября 18, 2010, 20:50
QCalendarWidget наследуется от QWidget, у которого есть слот bool QWidget::close () [slot]. Так что ты что-то путаешь.


Название: Re: Работа с QCalendarWidget в QItemDelegate
Отправлено: Nemo2000 от Ноября 18, 2010, 20:57
Да, я действительно опять напутал:)
Я в connect() третьим параметром указывал this, тоесть класс моего делегата.
А надо было указать мой календарь :)
Спасибо,что наставили на путь истинный ;D


Название: Re: Работа с QCalendarWidget в QItemDelegate
Отправлено: Пантер от Ноября 18, 2010, 21:03
:) Бывает.
Я вчера часа полтора искал баг в своей проге, оказалось, что ошибка в скобках. Написал new char (10) вместо new char [10]. Иногда бывает и похуже.  ;D


Название: Re: Работа с QCalendarWidget в QItemDelegate
Отправлено: Nemo2000 от Ноября 19, 2010, 13:25
Тогда ещё вопрос.
Как можно настроить положение этого календаря,чтобы он появлялся под ячейкой, ну или где-то возле неё.
По умолчанию его положение 0,0 в кординатах таблицы.
В функции UpdateEditorGeometry есть параметр option ,но с помощью него можно достать координаты таблицы,а не отдельной ячейки.


Название: Re: Работа с QCalendarWidget в QItemDelegate
Отправлено: Kolobok от Ноября 19, 2010, 14:15
QStyleOption::rect это координаты ячейки.


Название: Re: Работа с QCalendarWidget в QItemDelegate
Отправлено: crossly от Ноября 19, 2010, 14:33
а может лучше было бы использовать QDateEdit с setCalendarPopup(true).... не ??


Название: Re: Работа с QCalendarWidget в QItemDelegate
Отправлено: Nemo2000 от Ноября 19, 2010, 23:03
crossly, да это именно то что нужно :)
Я просто незнал про такой виджет. Спасибо всем))