Qt widget-->Calendar

摘要

基于Qt的界面开发在这里插入图片描述
QCalendarWidget 一次显示日历的月并让User 选择一个日期。这个日历有四个部分组成:导航栏让User改变月的显示,一个网格其中每个cell代表一个月的一天;两个表头显示周名和第几周。

QCalendarWidget 特性的总结

特性描述
selectedDate当前选择的日期
minimumDate能够选择最早的日期
maximumDate能够选择最晚的日期
firstDayOfWeek这天展现一周的第一天
gridVisble网格是否被显示
selectionModeUser是否能选择日期
horizontalHeaderFormat水平标题日期名字的格式
verticalHeaderFormat垂直格式标题的名字格式
navigationBarVisible在顶部的指引bar是否显示

Window Class Definition

class Window : public QWidget
  {
      Q_OBJECT

  public:
      Window();

  private slots:
      void localeChanged(int index);
      void firstDayChanged(int index);
      void selectionModeChanged(int index);
      void horizontalHeaderChanged(int index);
      void verticalHeaderChanged(int index);
      void selectedDateChanged();
      void minimumDateChanged(const QDate &date);
      void maximumDateChanged(const QDate &date);
      void weekdayFormatChanged();
      void weekendFormatChanged();
      void reformatHeaders();
      void reformatCalendarPage();

  private:
      void createPreviewGroupBox();
      void createGeneralOptionsGroupBox();
      void createDatesGroupBox();
      void createTextFormatsGroupBox();
      QComboBox *createColorComboBox();

      QGroupBox *previewGroupBox;
      QGridLayout *previewLayout;
      QCalendarWidget *calendar;

      QGroupBox *generalOptionsGroupBox;
      QLabel *localeLabel;
      QLabel *firstDayLabel;
      ...
      QCheckBox *mayFirstCheckBox;
  };

As is often the case with classes that represent self-contained windows, most of the API is private. We will review the private members as we stumble upon them in the implementation. 
Window Class Implementation
Let's now review the class implementation, starting with the constructor:

  Window::Window()
  {
      createPreviewGroupBox();
      createGeneralOptionsGroupBox();
      createDatesGroupBox();
      createTextFormatsGroupBox();

      QGridLayout *layout = new QGridLayout;
      layout->addWidget(previewGroupBox, 0, 0);
      layout->addWidget(generalOptionsGroupBox, 0, 1);
      layout->addWidget(datesGroupBox, 1, 0);
      layout->addWidget(textFormatsGroupBox, 1, 1);
      layout->setSizeConstraint(QLayout::SetFixedSize);
      setLayout(layout);

      previewLayout->setRowMinimumHeight(0, calendar->sizeHint().height());
      previewLayout->setColumnMinimumWidth(0, calendar->sizeHint().width());

      setWindowTitle(tr("Calendar Widget"));
  }

通过创建四个 QGroupBoxes和它们的子窗体开始。然后我们在QGridLayout布置group boxes.
我们通过设置 QLayout::SetFixedSize 来resize 窗口。

void Window::createPreviewGroupBox()
  {
      previewGroupBox = new QGroupBox(tr("Preview"));

      calendar = new QCalendarWidget;
      calendar->setMinimumDate(QDate(1900, 1, 1));
      calendar->setMaximumDate(QDate(3000, 1, 1));
      calendar->setGridVisible(true);

      connect(calendar, SIGNAL(currentPageChanged(int,int)),
              this, SLOT(reformatCalendarPage()));

      previewLayout = new QGridLayout;
      previewLayout->addWidget(calendar, 0, 0, Qt::AlignCenter);
      previewGroupBox->setLayout(previewLayout);
  }

我们实例化 QCalendarWidget。connect 信号currentPageChanged() 触发reformatCalendarPage() 确保每个new page 都能得到User指定格式。

void Window::createGeneralOptionsGroupBox()
  {
      generalOptionsGroupBox = new QGroupBox(tr("General Options"));

      localeCombo = new QComboBox;
      int curLocaleIndex = -1;
      int index = 0;
      for (int _lang = QLocale::C; _lang <= QLocale::LastLanguage; ++_lang) {
          QLocale::Language lang = static_cast<QLocale::Language>(_lang);
          QList<QLocale::Country> countries = QLocale::countriesForLanguage(lang);
          for (int i = 0; i < countries.count(); ++i) {
              QLocale::Country country = countries.at(i);
              QString label = QLocale::languageToString(lang);
              label += QLatin1Char('/');
              label += QLocale::countryToString(country);
              QLocale locale(lang, country);
              if (this->locale().language() == lang && this->locale().country() == country)
                  curLocaleIndex = index;
              localeCombo->addItem(label, locale);
              ++index;
          }
      }
      if (curLocaleIndex != -1)
          localeCombo->setCurrentIndex(curLocaleIndex);
      localeLabel = new QLabel(tr("&Locale"));
      localeLabel->setBuddy(localeCombo);

      firstDayCombo = new QComboBox;
      firstDayCombo->addItem(tr("Sunday"), Qt::Sunday);
      firstDayCombo->addItem(tr("Monday"), Qt::Monday);
      firstDayCombo->addItem(tr("Tuesday"), Qt::Tuesday);
      firstDayCombo->addItem(tr("Wednesday"), Qt::Wednesday);
      firstDayCombo->addItem(tr("Thursday"), Qt::Thursday);
      firstDayCombo->addItem(tr("Friday"), Qt::Friday);
      firstDayCombo->addItem(tr("Saturday"), Qt::Saturday);

      firstDayLabel = new QLabel(tr("Wee&k starts on:"));
      firstDayLabel->setBuddy(firstDayCombo);
      ...

在combobox上我们开始设置Week starts。这个combobox 控制着哪天应该作为week的第一天被显示出来。

void Window::createDatesGroupBox()
  {
      datesGroupBox = new QGroupBox(tr("Dates"));

      minimumDateEdit = new QDateEdit;
      minimumDateEdit->setDisplayFormat("MMM d yyyy");
      minimumDateEdit->setDateRange(calendar->minimumDate(),
                                    calendar->maximumDate());
      minimumDateEdit->setDate(calendar->minimumDate());

      minimumDateLabel = new QLabel(tr("&Minimum Date:"));
      minimumDateLabel->setBuddy(minimumDateEdit);

      currentDateEdit = new QDateEdit;
      currentDateEdit->setDisplayFormat("MMM d yyyy");
      currentDateEdit->setDate(calendar->selectedDate());
      currentDateEdit->setDateRange(calendar->minimumDate(),
                                    calendar->maximumDate());

      currentDateLabel = new QLabel(tr("&Current Date:"));
      currentDateLabel->setBuddy(currentDateEdit);

      maximumDateEdit = new QDateEdit;
      maximumDateEdit->setDisplayFormat("MMM d yyyy");
      maximumDateEdit->setDateRange(calendar->minimumDate(),
                                    calendar->maximumDate());
      maximumDateEdit->setDate(calendar->maximumDate());

      maximumDateLabel = new QLabel(tr("Ma&ximum Date:"));
      maximumDateLabel->setBuddy(maximumDateEdit);

日历的最大最小日期已经在createPrivewGroupBox()里设置。我们能够设置着这个窗口的初始值。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值