Russian Qt Forum
Ноябрь 24, 2024, 00:27 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: QCalendarWidget с возможностью выбора диапазона дат  (Прочитано 4454 раз)
fte
Гость
« : Июнь 14, 2012, 12:02 »

Гуглил ничего подобного толком не нашел...., написал сам,
пришлось приделать костыли, QCalendarWidget имеет одну виртуальную функцию paintCell, внутренняя модель закрыта....
ну вообщем, как-то так получилось, но работает!

calendarwidget.h
Код
C++ (Qt)
#ifndef CALENDARWIDGET_H
#define CALENDARWIDGET_H
 
#include <QCalendarWidget>
#include <QtGui>
 
class CalendarWidget : public QCalendarWidget
{
Q_OBJECT
public:
CalendarWidget(QWidget *parent = 0);
bool eventFilter(QObject *obj, QEvent *event);
void paintCell(QPainter *painter, const QRect &rect, const QDate &date) const;
 
QDate minSelectedDate() const { return minDate; }
QDate maxSelectedDate() const { return maxDate; }
 
public slots:
void setSelectedDate();
 
private:
Qt::KeyboardModifiers modifier;
QDate minDate;
QDate maxDate;
};
#endif // CALENDARWIDGET_H
 


calendarwidget.cpp

Код
C++ (Qt)
#include "calendarwidget.h"
 
CalendarWidget::CalendarWidget(QWidget *parent) :
QCalendarWidget(parent)
{
QTableView *view = qFindChild<QTableView *>(this);
view->viewport()->installEventFilter(this);
view->installEventFilter(this);
connect(this,SIGNAL(selectionChanged()),this,SLOT(setSelectedDate()));
minDate = maxDate = QDate::currentDate();
}
 
void CalendarWidget::paintCell(QPainter *painter, const QRect &rect, const QDate &date) const
{
if((date >= minDate && date <= maxDate) && date != selectedDate() )
{
painter->fillRect (rect, Qt::yellow);
painter->drawText (rect, Qt::AlignCenter | Qt::AlignHCenter,
QString::number(date.day ()));
return;
}
QCalendarWidget::paintCell(painter,rect,date);
}
 
void CalendarWidget::setSelectedDate()
{
QDate date = selectedDate();
if( modifier & Qt::ShiftModifier )
{
minDate = qMin(minDate,date);
maxDate = qMax(maxDate,date);
}
else
minDate = maxDate = date;
updateCells();
}
 
 
bool CalendarWidget::eventFilter(QObject *obj, QEvent *event)
{
if(event->type() == QEvent::MouseButtonRelease)
modifier = static_cast<QMouseEvent*>(event)->modifiers();
if(event->type() == QEvent::KeyPress)
modifier = static_cast<QKeyEvent*>(event)->modifiers();
return QCalendarWidget::eventFilter(obj, event);
}
 
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.141 секунд. Запросов: 21.