Название: календарь и не только Отправлено: sv219 от Ноябрь 30, 2005, 15:12 неуобходимо было сделать календарь, нашел его пример в хелпе, собрал скомпилил, работает отлично, только надо одно реализовать это выбор нужной даты. Сами числа пишуться в QTextTable, так вот как по клику мышки мне получить значение???
Название: календарь и не только Отправлено: zlatko от Ноябрь 30, 2005, 16:45 попробуй заюзать eventFilter
Название: календарь и не только Отправлено: sv219 от Декабрь 01, 2005, 06:15 а можно поподробней и желательно с примером, а то я в qt еще и не писал толком, заранее благодарен
Название: календарь и не только Отправлено: Zmey от Декабрь 01, 2005, 10:07 Цитата: "sv219" а можно поподробней и желательно с примером, а то я в qt еще и не писал толком, заранее благодарен Если "не писал толком", может попробуешь почитать Ассистант? Например, начни с изучения QTextTable. Название: календарь и не только Отправлено: sv219 от Декабрь 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 от Декабрь 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 |