РС
Руслан Склюев20 червня 2020 р. 15:55

QML DATAEDIT

Здравствуйте, какой элемент QML можно использовать под редактирование даты? Мне нужен простой Edit, чтобы пользователь ввел 21052020 и ему автоматический точки расставились, т.е. стало 21.05.2020 и дальше не позволяло вводить. Я так понимаю, что это самому через функции нужно?
Функцию получении даты сделал.

 function addZero(value){
        if(value<10){
            return '0' + value
        }
        else{
            return value
        }
    }

    function getFormat(date){
        var year = date.getFullYear()
        var month = date.getMonth()
        var day = date.getDate()

        return addZero(day) + '.' + addZero(month+1) + '.' + year
    }
Рекомендуємо хостинг TIMEWEB
Рекомендуємо хостинг TIMEWEB
Стабільний хостинг, на якому розміщується соціальна мережа EVILEG. Для проектів на Django радимо VDS хостинг.

Вам це подобається? Поділіться в соціальних мережах!

6
РС
  • 20 червня 2020 р. 19:26

Сделал элемент, все вводится. Осталось только проверить дату на корректность. Как быть? Есть метод isValid, но он почему-то работать не хочет.

import QtQuick 2.0
import QtQuick.Controls 1.4

Item {
    id: dateEdit

    readonly property date currentDate: calendar.selectedDate
    readonly property bool isCalendarOpened: calendar.visible
    property string color: "lightblue"

    signal calendarOpened;
    signal calendarClosed;

    width: textField.width + btnOpen.width
    height: textField.height

    Column {
        id: column
        spacing: 2

        Row {
            spacing: 5
            TextField {
                id: textField
                text: Qt.formatDate(calendar.selectedDate, "dd.MM.yyyy");
//                readOnly: true
                Keys.onPressed:
                  {
                    if (text.isValid()) {
                        console.log ( "Date " + " is a valid date")
                    } else {
                         console.log ("Date " + " is not a valid date")
                    }
                    console.log("Press = " + event.key)
                    console.log("Current text is " + text)
                  }
                  Keys.onReleased:
                  { text: "99.99.9999"
                    console.log("Release = " + event.key)
                    console.log("Current text is " + text)
                  }
               inputMask: "99.99.9999"
                inputMethodHints: Qt.ImhDigitsOnly
                Keys.onUpPressed:  calendar.__selectNextDay()
                Keys.onDownPressed: calendar.__selectPreviousDay()
            }
            Rectangle {
                id: btnOpen
                radius: 5
                width: 30
                height: textField.height
                color: dateEdit.color

                Text {
                    text: "*"
                }

                MouseArea {
                    anchors.fill: parent

                    onClicked: {
                        dateEdit.isCalendarOpened ?  closeCalendar() : openCalendar()
                    }
                }
            }
        }

        Calendar {
            id: calendar
            visible: false
            dayOfWeekFormat: Locale.ShortFormat
            onClicked: {
                closeCalendar()
            }

            function open()
            {
                visible = true
            }

            function close()
            {
                visible = false
            }
        }
    }

    function openCalendar()
    {
        calendar.open()
        calendarOpened()
    }

    function closeCalendar()
    {
        calendar.close()
        calendarClosed()
    }
}

    РС
    • 21 червня 2020 р. 01:32
    • (відредаговано)

    Доделал, но остался единственный баг с месяцами: число он нормально отрабатывает, а если ввожу месяц и стоит 06, то получается 16, то он сбрасывается. Как исправить?

    import QtQuick 2.0
    import QtQuick.Controls 1.4
    
    
    
    
    
    Item {
        id: dateEdit
    
        readonly property date currentDate: calendar.selectedDate
        readonly property bool isCalendarOpened: calendar.visible
        property string color: "lightblue"
    
        signal calendarOpened;
        signal calendarClosed;
    
        width: textField.width + btnOpen.width
        height: textField.height
    
        Column {
            id: column
            spacing: 2
    
            Row {
                spacing: 5
                TextField {
                    id: textField
                    text: Qt.formatDate(calendar.selectedDate, "dd.MM.yyyy");
                    //                readOnly: true
    
                    function validate_date(value)
                    {
                        var arrD = value.split(".");
                        arrD[1] -= 1;
                        var d = new Date(arrD[2], arrD[1], arrD[0]);
                        if ((d.getFullYear() == arrD[2]) && (d.getMonth() == arrD[1]) && (d.getDate() == arrD[0])) {
                            return true;
                        } else {
    
                            return false;
                        }
                    }
    
                    function getMonth(value)
                    {
                        var arrm = value.split(".");
                        arrm[1] -= 0;
                            return arrm[1];
    
                    }
    
                    function getDay(value)
                    {
                        var arrd = value.split(".");
                        arrd[0] -= 0;
                            return arrd[0];
    
                    }
    
                    Keys.onReleased:
                   {validate_date(text)?console.log("Current data: "+(text.substring(3,5))):{text=Qt.formatDate(calendar.selectedDate, "dd.MM.yyyy")}}
                    inputMask: "99.99.9999"
                    inputMethodHints: Qt.ImhDigitsOnly
                    Keys.onUpPressed:  calendar.__selectNextDay()
                    Keys.onDownPressed: calendar.__selectPreviousDay()
                }
                Rectangle {
                    id: btnOpen
                    radius: 5
                    width: 30
                    height: textField.height
                    color: dateEdit.color
    
                    Text {
                        text: "*"
                    }
    
                    MouseArea {
                        anchors.fill: parent
    
                        onClicked: {
                            dateEdit.isCalendarOpened ?  closeCalendar() : openCalendar()
                        }
                    }
                }
            }
    
            Calendar {
                id: calendar
                visible: false
                dayOfWeekFormat: Locale.ShortFormat
                onClicked: {
                    closeCalendar()
                }
    
                function open()
                {
                    visible = true
                }
    
                function close()
                {
                    visible = false
                }
            }
        }
    
        function openCalendar()
        {
            calendar.open()
            calendarOpened()
        }
    
        function closeCalendar()
        {
            calendar.close()
            calendarClosed()
        }
    }
    
      S
      • 21 червня 2020 р. 06:54
      • (відредаговано)

      Либо, это не полный код, либо... Просто непонятно откуда взялся массив arrm в функции getMounth , так как вы используете arrd

        РС
        • 21 червня 2020 р. 06:56

        там несколько функций

          РС
          • 22 червня 2020 р. 14:15

          Доделал

          import QtQuick 2.0
          import QtQuick.Controls 1.4
          
          Item {
              id: dateEdit
          
              readonly property date currentDate: calendar.selectedDate
              readonly property bool isCalendarOpened: calendar.visible
              property string color: "lightblue"
          
              signal calendarOpened;
              signal calendarClosed;
          
              width: textFielddata.width + btnOpen.width
              height: textFielddata.height
          
              Column {
                  id: column
                  spacing: 2
          
                  Row {
                      spacing: 5
                      TextField {
                          id: textFielddata
                          text: Qt.formatDate(calendar.selectedDate, "dd.MM.yyyy");
                          //                readOnly: true
          
                          function validate_date(value)
                          {
                              var arrD = value.split(".");
                              arrD[1] -= 1;
                              var d = new Date(arrD[2], arrD[1], arrD[0]);
                              if ((d.getFullYear() == arrD[2]) && (d.getMonth() == arrD[1]) && (d.getDate() == arrD[0])) {
                                  return true;
                              } else {
          
                                  return false;
                              }
                          }
          
          
                          validator: RegExpValidator { regExp: /^([0-2]?[1-9]|3[0-9]).(0?[1-9]|1[0-9]).([0-9][0-9][0-9][0-9])$ / } // /^([0-2]?[1-9]|3[0-1]).(0?[1-9]|1[0-2]).([0-9][0-9][0-9][0-9])$ /
                          Keys.onReleased:
                          {if (validate_date(text)) {console.log("Current data: "+(text))} else if ([text[3]].toString() == "1") {text=text.substring(0,4)+0+text.substring(5);textFielddata.cursorPosition=5} else if ([text[0]].toString() == "3"&&([text[1]].toString()!="0")&&([text[1]].toString()!="1"))  {text=text.substring(0,1)+0+text.substring(2);textFielddata.cursorPosition=1} else {text="01"+text.substring(2);textFielddata.cursorPosition=0}}
                          inputMask:"99.99.9999";
                          inputMethodHints: Qt.ImhDigitsOnly
                          Keys.onUpPressed:  calendar.__selectNextDay()
                          Keys.onDownPressed: calendar.__selectPreviousDay()
                      }
                      Rectangle {
                          id: btnOpen
                          radius: 5
                          width: 30
                          height: textFielddata.height
                          color: dateEdit.color
          
                          Text {
                              text: "*"
                          }
          
                          MouseArea {
                              anchors.fill: parent
          
                              onClicked: {
                                  dateEdit.isCalendarOpened ?  closeCalendar() : openCalendar()
                              }
                          }
                      }
                  }
          
                  Calendar {
                      id: calendar
                      visible: false
                      dayOfWeekFormat: Locale.ShortFormat
                      onClicked: {
                          closeCalendar()
                      }
          
                      function open()
                      {
                          function get_date(value)
                          {
                              var arrD = value.split(".");
                              arrD[1] -= 1;
                              var d = new Date(arrD[2], arrD[1], arrD[0]);
                              if ((d.getFullYear() == arrD[2]) && (d.getMonth() == arrD[1]) && (d.getDate() == arrD[0])) {
                                  return d;
                              } else {
          
                                  return false;
                              }}
          
                          calendar.selectedDate=new Date(get_date(textFielddata.text));
                          visible = true
          
                      }
          
                      function close()
                      {
                          visible = false
                      }
                  }
              }
          
              function openCalendar()
              {
                  calendar.open()
                  calendarOpened()
              }
          
              function closeCalendar()
              {
                  calendar.close()
                  calendarClosed()
              }
          }
          
          Вызов
          
          import QtQuick 2.9
          import QtQuick.Window 2.2
          import QtQuick.Controls 2.5
          import QtQuick.Controls 2.5
          
          Window {
              visible: true
              width: 640
              height: 480
              title: qsTr("QML DATAEDIT тест")
          
              QmlDateEdit{
          
              }
          
          }
          
          
            РС
            • 27 червня 2020 р. 09:23
            • (відредаговано)

            Доработка функции:

            Доработка функции:
            function open()
                        {
                            function get_date(value)
                            {
                                var arrD = value.split(".");
                                arrD[1] -= 1;
                                var d = new Date(arrD[2], arrD[1], arrD[0]);
                                if ((d.getFullYear() == arrD[2]) && (d.getMonth() == arrD[1]) && (d.getDate() == arrD[0])) {
                                    return d;
                                } else {
            
                                    return false;
                                }}
            
                            calendar.selectedDate=new Date(get_date(textFielddata.text));
                            visible = true
            
                        }
            

              Коментарі

              Only authorized users can post comments.
              Please, Log in or Sign up
              AD

              C++ - Тест 004. Указатели, Массивы и Циклы

              • Результат:50бали,
              • Рейтинг балів-4
              m
              • molni99
              • 26 жовтня 2024 р. 01:37

              C++ - Тест 004. Указатели, Массивы и Циклы

              • Результат:80бали,
              • Рейтинг балів4
              m
              • molni99
              • 26 жовтня 2024 р. 01:29

              C++ - Тест 004. Указатели, Массивы и Циклы

              • Результат:20бали,
              • Рейтинг балів-10
              Останні коментарі
              ИМ
              Игорь Максимов22 листопада 2024 р. 11:51
              Django - Підручник 017. Налаштуйте сторінку входу до Django Добрый вечер Евгений! Я сделал себе авторизацию аналогичную вашей, все работает, кроме возврата к предидущей странице. Редеректит всегда на главную, хотя в логах сервера вижу запросы на правильн…
              Evgenii Legotckoi
              Evgenii Legotckoi31 жовтня 2024 р. 14:37
              Django - Урок 064. Як написати розширення для Python Markdown Добрый день. Да, можно. Либо через такие же плагины, либо с постобработкой через python библиотеку Beautiful Soup
              A
              ALO1ZE19 жовтня 2024 р. 08:19
              Читалка файлів fb3 на Qt Creator Подскажите как это запустить? Я не шарю в программировании и кодинге. Скачал и установаил Qt, но куча ошибок выдается и не запустить. А очень надо fb3 переконвертировать в html
              ИМ
              Игорь Максимов05 жовтня 2024 р. 07:51
              Django - Урок 064. Як написати розширення для Python Markdown Приветствую Евгений! У меня вопрос. Можно ли вставлять свои классы в разметку редактора markdown? Допустим имея стандартную разметку: <ul> <li></li> <li></l…
              d
              dblas505 липня 2024 р. 11:02
              QML - Урок 016. База даних SQLite та робота з нею в QML Qt Здравствуйте, возникает такая проблема (я новичок): ApplicationWindow неизвестный элемент. (М300) для TextField и Button аналогично. Могу предположить, что из-за более новой верси…
              Тепер обговоріть на форумі
              Evgenii Legotckoi
              Evgenii Legotckoi24 червня 2024 р. 15:11
              добавить qlineseries в функции Я тут. Работы оень много. Отправил его в бан.
              t
              tonypeachey115 листопада 2024 р. 06:04
              google domain [url=https://google.com/]domain[/url] domain [http://www.example.com link title]
              NSProject
              NSProject04 червня 2022 р. 03:49
              Всё ещё разбираюсь с кешем. В следствии прочтения данной статьи. Я принял для себя решение сделать кеширование свойств менеджера модели LikeDislike. И так как установка evileg_core для меня не была возможна, ибо он писался…
              9
              9Anonim25 жовтня 2024 р. 09:10
              Машина тьюринга // Начальное состояние 0 0, ,<,1 // Переход в состояние 1 при пустом символе 0,0,>,0 // Остаемся в состоянии 0, двигаясь вправо при встрече 0 0,1,>…

              Слідкуйте за нами в соціальних мережах