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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: календарь и не только  (Прочитано 4888 раз)
sv219
Гость
« : Ноябрь 30, 2005, 15:12 »

неуобходимо было сделать календарь, нашел его пример в хелпе, собрал скомпилил, работает отлично, только надо одно реализовать это выбор нужной даты. Сами числа пишуться в QTextTable, так вот как по клику мышки мне получить значение???
Записан
zlatko
Гость
« Ответ #1 : Ноябрь 30, 2005, 16:45 »

попробуй заюзать eventFilter
Записан
sv219
Гость
« Ответ #2 : Декабрь 01, 2005, 06:15 »

а можно поподробней и желательно с примером, а то я в qt еще и не писал толком, заранее благодарен
Записан
Zmey
Гость
« Ответ #3 : Декабрь 01, 2005, 10:07 »

Цитата: "sv219"
а можно поподробней и желательно с примером, а то я в qt еще и не писал толком, заранее благодарен

Если "не писал толком", может попробуешь почитать Ассистант? Например, начни с изучения QTextTable.
Записан
sv219
Гость
« Ответ #4 : Декабрь 01, 2005, 10:24 »

у меня ща не понятка

зарегил фильтр событий на QTextTable
table->installEventFilter(this);
затем сделал
bool mainWindow::eventFilter(QObject *target, QEvent *event)
{
 if (target == table)
 {
   if (event->type() == QEvent::MouseButtonPress)
   {
     QMessageBox::information("test", "test");
   }
 }
}
компилиться, но событие не срабатывает, если же проделать такое же например с кнопкой то все работает, подскажите что не так?
Записан
crocus
Гость
« Ответ #5 : Декабрь 01, 2005, 12:13 »

calendar.cpp
#include <QtGui>
#include "calendar.h"


PopupCalendar::PopupCalendar(const QDate &day, QWidget *parent)
        : QDialog(parent), today(day), original(day)
{

   
    smallFont = font();
    if (smallFont.pointSize() >= 10)
    {
        smallFont.setPointSize(smallFont.pointSize() - 2);
        smallFont.setBold(true);
    }
   /*setFixedSize(sizeHint());*/
    setFocusPolicy(Qt::StrongFocus);
}

QSize PopupCalendar::sizeHint() const
{
    QFontMetrics fm(smallFont);
    return QSize(COLS * fm.width(tr("Wed")), (ROWS + 2) * fm.height() * 1.2);
}

QDate PopupCalendar::getDate(QWidget *parent, const QDate &day, QPoint pos)
{
    PopupCalendar *calendar = new PopupCalendar();
    calendar->exec();
    QDate date = calendar->day();
    delete calendar;
    return date;
}
void PopupCalendar::setDay(const QDate &day)
{
    today = day;
    update();
    emit newDay(today);
}

void PopupCalendar::mousePressEvent(QMouseEvent *event)
{
    QDate day = today;
    int dayh2 = (height() / (ROWS + 2)) * 2;
    if (event->y() < dayh2)
    {
        if (event->x() < width() / 2)
            day = day.addMonths(-1);
        else
            day = day.addMonths(1);
    }
    else
    {
        day = QDate(today.year(), today.month(), 1);
        int xday = event->x() / (width() / COLS);
        int yday = (event->y() - dayh2) / ((height() - dayh2) / ROWS);
        day = day.addDays(xday + COLS * yday);
    }
    if (day != today)
        setDay(day);
}

void PopupCalendar::keyPressEvent(QKeyEvent *event)
{
    int days = 0;
    switch (event->key())
    {
        case Qt::Key_Left:
        days = -1;
        break;
        case Qt::Key_Right:
        days = 1;
        break;
        case Qt::Key_Up:
        days = -COLS;
        break;
        case Qt::Key_Down:
        days = COLS;
        break;
        case Qt::Key_PageUp:
        days = today.daysTo(today.addMonths(-1));
        break;
        case Qt::Key_PageDown:
        days = today.daysTo(today.addMonths(1));
        break;
        case Qt::Key_Home:
        days = today.daysTo(today.addYears(-1));
        break;
        case Qt::Key_End:
        days = today.daysTo(today.addYears(1));
        break;
        case Qt::Key_Escape:
        today = original;
        accept();
        break;
        case Qt::Key_Space: // fallthrough
        case Qt::Key_Enter: // fallthrough
        case Qt::Key_Return:
        accept();
        return;
        default:
        QDialog::keyPressEvent(event);
        return;
    }
    QDate day = today.addDays(days);
    if (day != today)
        setDay(day);
}

void PopupCalendar::paintEvent(QPaintEvent *event)
{
    QPainter painter(this);
    painter.setClipRegion(event->region());
    painter.setFont(smallFont);
    int w = width();
    int h = height();
    int dayh = h / (ROWS + 2);
    int dayw = w / COLS;
    QRect rect;
    painter.drawText(1, 1, w - 1, dayh - 1, Qt::AlignHCenter,
                     today.toString("<<  yyyy MMMM  >>"), &rect);
    int y = dayh;
    QDate day(today.year(), today.month(), 1);
    int i;
   
    for (i = 0; i < COLS; ++i)
    {
        painter.drawText(dayw * i + 1, y, dayw, dayh - 1,
                         Qt::AlignHCenter, day.toString("ddd"), &rect);
        day = day.addDays(1);
    }
    day = day.addDays(-COLS);
    y += dayh;
   
    for (int j = 0; j < ROWS; ++j)
        for (i = 0; i < COLS; ++i)
        {
            QColor color = day == today ? Qt::darkGray : Qt::lightGray;
            painter.fillRect(dayw * i + 1, dayh * j + y + 1, dayw - 1, dayh - 1, color);
            painter.drawText(dayw * i + 2, dayh * j + y + 2, dayw,
                             dayh, Qt::AlignTop|Qt::AlignJustify, day.toString("d"));
            day = day.addDays(1);
        }
}

calendar.h
#ifndef CALENDAR_H
#define CALENDAR_H
#include <QtGui>
#include <QDialog>
#include <QKeyEvent>

class PopupCalendar : public QDialog
    {
        Q_OBJECT
    public:
        PopupCalendar(const QDate &day = QDate::currentDate(), QWidget *parent = 0);
   
        static QDate getDate(QWidget *parent = 0, const QDate &day = QDate::currentDate(),
                             QPoint pos = QPoint());
   
      const QDate &day() const { return today; }
        void setDay(const QDate &day);
        QSize sizeHint() const;
    signals:
     void newDay(const QDate &day);
    protected:
        void mousePressEvent(QMouseEvent *event);
        void keyPressEvent(QKeyEvent *event);
        void paintEvent(QPaintEvent *event);
   
    private:
        enum { ROWS = 6, COLS = 7 };
   
        QFont smallFont;
        QDate today;
        const QDate original;
    };
#endif
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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