翻譯|使用教程|編輯:龔雪|2023-06-13 10:01:01.480|閱讀 233 次
概述:本文主要演示如何使用CalendarWidget組件來為Qt Widget應用程序創建日歷,歡迎下載相關的Qt Widget組件體驗!
# 界面/圖表報表/文檔/IDE等千款熱門軟控件火熱銷售中 >>
相關鏈接:
Qt 是目前最先進、最完整的跨平臺C++開發工具。它不僅完全實現了一次編寫,所有平臺無差別運行,更提供了幾乎所有開發過程中需要用到的工具。如今,Qt已被運用于超過70個行業、數千家企業,支持數百萬設備及應用。
本文中的CalendarWidget示例展示了QCalendarWidget的用法。
Qt技術交流群:166830288 歡迎一起進群討論
QCalendarWidget一次顯示一個日歷月,并允許用戶選擇一個日期。日歷由四個組件組成:一個允許用戶更改顯示月份的導航欄、一個網格,其中每個單元格表示一個月中的一天,以及兩個顯示星期名稱和星期數字的標題。
Calendar Widget示例顯示一個QCalendarWidget,并允許用戶使用QComboBoxes、QCheckBoxes和QDateEdits配置其外觀和操作,此外,用戶可以影響單個日期和標題的格式。
QCalendarWidget的屬性總結如下:
本示例包含一個類Window,它創建并布局QCalendarWidget和其他讓用戶配置QCalendarWidget的小部件。
下面是Window類的定義:
class Window : public QWidget { Q_OBJECT public: Window(QWidget *parent = nullptr); 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(QDate date); void maximumDateChanged(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; };
與表示自包含窗口的類一樣,大多數API都是私有的。當我們在執行過程中偶然發現私人成員時,將對其進行審查。
現在讓我們回顧一下類的實現,從構造函數開始:
Window::Window(QWidget *parent) : QWidget(parent) { 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")); }
我們首先使用四個私有的create…GroupBox()函數創建四個qgroupbox及其子部件(包括QCalendarWidget),如下所述,然后在QGridLayout中安排組框。
我們將網格布局的調整大小策略設置為QLayout::SetFixedSize,以防止用戶調整窗口大小。在這種模式下,窗口的大小由QGridLayout根據其內容小部件的大小提示自動設置。
為了確保在每次更改QCalendarWidget的屬性(例如,隱藏導航欄、垂直標題或網格)時不會自動調整窗口的大小,我們將第0行的最小高度和第0列的最小寬度設置為QCalendarWidget的初始大小。
讓我們來看看createPreviewGroupBox()函數:
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, &QCalendarWidget::currentPageChanged, this, &Window::reformatCalendarPage); previewLayout = new QGridLayout; previewLayout->addWidget(calendar, 0, 0, Qt::AlignCenter); previewGroupBox->setLayout(previewLayout); }
Preview組框只包含一個小部件:QCalendarWidget,我們設置它,將它的currentPageChanged()信號連接到reformatCalendarPage()插槽,以確保每個新頁面都獲得用戶指定的格式。
createGeneralOptionsGroupBox()函數有點大,并且以相同的方式設置了幾個小部件。我們將在這里查看它的部分實現,并跳過其余部分:
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); const auto locales = QLocale::matchingLocales(lang, QLocale::AnyScript, QLocale::AnyTerritory); for (auto loc : locales) { QString label = QLocale::languageToString(lang); auto territory = loc.territory(); label += QLatin1Char('/'); label += QLocale::territoryToString(territory); if (locale().language() == lang && locale().territory() == territory) curLocaleIndex = index; localeCombo->addItem(label, loc); ++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); ...
我們從組合框上的周開始設置開始,此組合框控制哪一天應顯示為一周的第一天。
QComboBox類允許我們將用戶數據作為QVariant附加到每個項目,稍后可以使用QComboBox的itemData()函數檢索數據。QVariant不直接支持Qt::DayOfWeek數據類型,但它支持int, c++會很樂意將任何enum值轉換為int。
... connect(localeCombo, &QComboBox::currentIndexChanged, this, &Window::localeChanged); connect(firstDayCombo, &QComboBox::currentIndexChanged, this, &Window::firstDayChanged); connect(selectionModeCombo, &QComboBox::currentIndexChanged, this, &Window::selectionModeChanged); connect(gridCheckBox, &QCheckBox::toggled, calendar, &QCalendarWidget::setGridVisible); connect(navigationCheckBox, &QCheckBox::toggled, calendar, &QCalendarWidget::setNavigationBarVisible); connect(horizontalHeaderCombo, &QComboBox::currentIndexChanged, this, &Window::horizontalHeaderChanged); connect(verticalHeaderCombo, &QComboBox::currentIndexChanged, this, &Window::verticalHeaderChanged); ...
在創建了小部件之后,我們連接信號和插槽,將組合框連接到Window的私有槽或QComboBox提供的公共槽。
... firstDayChanged(firstDayCombo->currentIndex()); selectionModeChanged(selectionModeCombo->currentIndex()); horizontalHeaderChanged(horizontalHeaderCombo->currentIndex()); verticalHeaderChanged(verticalHeaderCombo->currentIndex()); }
在函數的最后,我們調用更新日歷的槽,以確保QCalendarWidget在啟動時與其他小部件同步。
在下文中,我們將繼續介紹更多實現窗口類的函數,歡迎持續關注哦~
本站文章除注明轉載外,均為本站原創或翻譯。歡迎任何形式的轉載,但請務必注明出處、不得修改原文相關鏈接,如果存在內容上的異議請郵件反饋至chenjj@fc6vip.cn
文章轉載自:慧都網