11 августа 2019 г. 9:15

Как в QML сделать календарь?

Добрый день.
Как в QML сделать календарь?
Это не подходит, т.к. использую QtQuick.Controls 2.12

Рекомендуем хостинг TIMEWEB
Рекомендуем хостинг TIMEWEB
Стабильный хостинг, на котором располагается социальная сеть EVILEG. Для проектов на Django рекомендуем VDS хостинг.
11
R

Так ви можите використовувати і 1.4 одночасно

Не могу, qt так не работает.
Если делаю так, то страничка не работает:

import QtQuick 2.12
import QtQuick.XmlListModel 2.12
import QtQuick.Controls 2.12
import AppCore 1.0
import QtQuick.Controls 1.12
R

Тому що для календаря потрібний
import QtQuick.Controls 1.4
Якщо в файлі нічого специфічного не використовується то можна просто замінити версію, а якщо ніяк то або винести календар в окремий файл а потім підключити його, або... Вроді так теж має працювати
import QtQuick.Controls 1.4 as Controlold

Controlold.Calendar {
minimumDate: new Date(2017, 0, 1)
maximumDate: new Date(2018, 0, 1)
}

Краще ще почитати
https://doc.qt.io/qt-5/qtqml-syntax-imports.html

к слову говоря есть и для вторых контролов какие-то наработки по календарю.

https://doc.qt.io/archives/qt-5.7/qt-labs-calendar2-qmlmodule.html

С помощью этого получилось вставить календарь. Но как прикрутить подсветку и маусареи к нужным дням?

Можете сделать это с помощью делегата. Предполагаю, что это можно сделать примерно так

MonthGrid {
    month: Calendar.December
    year: 2015
    locale: Qt.locale("en_US")
    delegate: Item {

        MouseArea {
            anchors.fill.parent
        }
    }
}

Но мне нужно привязать к дням месяца, а не ко всему месяцу.

делегат отвечает за представление одного дня в месяце в данном случае. Да, вы добавляете MouseArea к делегату, а уже в обработчиках MouseArea можете проверить, какой именно день кликнули.

Если так добавляю делегата, то календарь перестает отображаться. Скажите пожалуйста, почему так и как исправить?

    MonthGrid {
        id: mothGrid1
        month: Calendar.December
        year: 2019
        x: 23
        y: 154
        width: 340
        height: 355
        //locale: Qt.locale("en_US")

        delegate: Item {
            MouseArea{
                anchors.fill: parent
                //onClicked: console.log("day = " )
            }
        }

Ну потому, что делегат отвечает за представление одного элемента модели, когда вы его переопределяете, то вам нужно полностью написать его вёрстку. Естественно, что у вас ничего не отображается в этом случае, поскольку вы не написали, что отображать в делегате. Делегат - это внешний вид одной ячейки даты календаря, если вы не указываете нигде текст ячейки, то и не увидите его.

Вот рабочий код

import QtQuick 2.12
import QtQuick.Window 2.12
import Qt.labs.calendar 1.0

Window {
    visible: true
    width: 640
    height: 480
    title: qsTr("Hello World")


    MonthGrid {
        id: mothGrid1
        month: Calendar.December
        year: 2019
        x: 20
        y: 20
        width: 340
        height: 355

        delegate: Item {
            Text {
                anchors.fill: parent
                text: model.day
            }
            MouseArea{
                anchors.fill: parent
            }
        }
    }
}

Вообще, вы можете использовать такое обращение к данным модели

  • model.date : date The date of the cell
  • model.day : int The number of the day
  • model.today : bool Whether the delegate represents today
  • model.weekNumber : int The week number
  • model.month : int The number of the month
  • model.year : int The number of the year
  • 12 августа 2019 г. 4:06
  • (ред.)

в самом Qt есть пример календаря (welcome->examples->Calendar Widget Example)


есть и тут пример

Комментарии

Только авторизованные пользователи могут публиковать комментарии.
Пожалуйста, авторизуйтесь или зарегистрируйтесь
Donate

Здравствуйте, уважаемые пользователи EVILEG !!!

Если сайт вам помог, то поддержите разработку сайта финансово, пожалуйста.

Вы можете сделать это следующими способами:

Спасибо, Евгений Легоцкой

AS
13 декабря 2019 г. 6:05
Aruzhan Seraliyeva

C++ - Тест 003. Условия и циклы

  • Результат:50баллов,
  • Очки рейтинга-4
AS
13 декабря 2019 г. 5:47
Aruzhan Seraliyeva

C++ - Тест 001. Первая программа и типы данных

  • Результат:40баллов,
  • Очки рейтинга-8
Т
11 декабря 2019 г. 16:56
Тома

C++ - Тест 003. Условия и циклы

  • Результат:50баллов,
  • Очки рейтинга-4
Последние комментарии
9 декабря 2019 г. 3:41
Евгений Легоцкой

Эта ошибка invalid use of incomplete type ‘class Ui::AnotherWindow’ обычно говорит о том, что не найдено определение класса или структуры. Типичная проблема - не подключён заголовочны…
НБ
9 декабря 2019 г. 3:36
Николай Батманов

Ну, не настолько со мной всё полхо...))) Вроде бы. Я ж кнопки отрисовываю.
9 декабря 2019 г. 3:14
Евгений Легоцкой

Добрый день. У вас ui файлов по ходу нет. UI файлы используются для вёрстки в графическом дизайнере.
НБ
9 декабря 2019 г. 3:05
Николай Батманов

Здравствуйте! Полностью скопировал ваш пример к себе, чтобы разобраться. А он не хочет запускаться, дает ошибку: invalid use of incomplete type ‘class Ui::AnotherWindow’ ui(new Ui…
8 декабря 2019 г. 7:23
Евгений Легоцкой

У меня здесь есть одна старая статья с примером векторного редактора. Там есть ответы на ваши вопросы. Поизучайте Qt/C++ - Урок 072. Пример векторного редактора на Qt QGraphicsItem, QG…
Сейчас обсуждают на форуме
t
13 декабря 2019 г. 17:17
tantrido

Всё работает, при чём тут колхоз?! ;) https://doc.qt.io/qt-5/qtqml-cppintegration-data.html Если что-то не работает - вопрос к собственным рукам и знаниям. Вопрос не корректен - мож…
13 декабря 2019 г. 10:16
Руслан Волшебник

Да, я посмотрел, вы абсолютно правы. Единственное, если я правильно понял, если срабатывает условие if (aggregates["max_id"] - aggregates["min_id"]) + 1 == aggregates["count"]: return sel…
t
13 декабря 2019 г. 9:53
tantrido

Ответ >>
13 декабря 2019 г. 8:39
Александр Панюшкин

Вроде да. Только там начинаются вопросы с тем, чтобы виджет бы в фокусе, чтобы до виджета это событие долетало.
ДК
13 декабря 2019 г. 7:48
Джон Кофи

Привет. Есть класс "ждун", который используется на разных виджетах: class WaiterDialog;#define WAITER_DIALOG Singleton<WaiterDialog>::instance()class WaiterDialog : public QObject, …
EVILEG
О нас
Услуги
© EVILEG 2015-2019
Рекомендует хостинг TIMEWEB