QML之TimeEdit的实现

在使用QML设计界面的时候,用到了时间编辑框,发现QML中没有提供类似QTWidget中的QTimeEdit控件。后来没有办法就自己使用TextField和Calendar封装了一个TimeEdit组件

1、自定义编辑框TimeInput组件

时间编辑框通常都是一个输入框,前部分显示时间后面有个日历的小图标,点击可以显示日历进行选择日期。文本输入框QML中之后TextField和TextInput,但是都不符合这样的界面效果,所以这块也封装实现了一个这样的输入框。

TimeInput组件的实现:

/**************************************
  *文件名:TimeInput.qml
  ***************************************/
import QtQuick 2.0
import QtQml 2.2
import QtQuick.Controls 1.3
import QtQuick.Controls.Styles 1.3
//时间编辑框组件
Rectangle
{
    id:rect
    width: parent.width
    height: parent.height
    border.width: 1
    border.color: "#333"
    /*******************************自定义属性*********************************/
    property var locale: Qt.locale()
    property alias strTime: textEdit.text
    property string oldTime: ""
    /**********************************自定义信号*******************************/
    signal clicked()
    /*******************************对象树*************************************/
    Row{
        id:row
        anchors.top: parent.top
        anchors.topMargin: 1
        anchors.left: parent.left
        anchors.leftMargin: 1
        width: children.width
        height: children.height
        spacing: 2
        //文本编辑框
        TextField{
            id:textEdit
            width:rect.width-25
            height:rect.height-2
            style:TextFieldStyle{
                background: Rectangle{
                    radius: 2
                    width: rect.width-25
                    height: rect.height-2
                }
            }
            onEditingFinished:{
                //编辑完成进行格式判断
                if(rect.checkTimeFomat() === false)
                {
                    textEdit.text = oldTime
                }
                else
                {
                    oldTime = textEdit.text
                }
            }
        }
        //日历小图标
        Image{
            width: 16
            height: 16
            anchors.top:parent.top
            anchors.topMargin: 4
            source: "picture/calendar.png"
            MouseArea{
                anchors.fill: parent
                onClicked: {
                    rect.clicked()
                    mouse.accepted = false
                }
            }
        }
    }
    /************************************方法***********************************/
    //检查输入的时间的合法性。原理就是把文本按照合法的格式解析出各个部分,再都在出日期Date,
    //把Date转换为string之后判断和原来的文本是否一致
    function checkTimeFomat()
    {
        var strDateTimeSplit = strTime.split(" ")
        var strDateSplit = strDateTimeSplit[0].split("/")
        var strTimeSplit = strDateTimeSplit[1].split(":")
        var date = new Date(strDateSplit[0],strDateSplit[1]-1,strDateSplit[2],strTimeSplit[0],strTimeSplit[1],0)

        var strDate2 = date.toLocaleString("yyyy/M/d H:mm")
        console.log(strDate2)
        if(strDate2  !== strTime)
            return false
        else
            return true

    }
}



  并在这个组件中添加了对用户输入的时间格式继续合法性检查功能,如发现不合法则输入不成功,显示原本的时间,在checkTimeFomat方法中实现。当TextFiled编辑完成时进行调用 

2、自定义TimeEdit组件

TimeEdit组件就是把上面实现的TimeInput组件和一个Calender(日历)组件整合实现了我们最终需要的TextEdit时间编辑组件

TextEdit组件的实现:

/**************************************
  *文件名:TimeEdit.qml
  ***************************************/
import QtQuick 2.3
import QtQuick.Window 2.2
import QtQuick.Controls 1.3
import QtQml 2.2

//TimeEdit组件
Rectangle {
    width: 100
    height: 25
    /**********************************自定义属性***********************************/
    property alias text: textEdit.strTime     //保存当前的时间文本
    property date currentDate: new Date()
    /***********************************对象树*************************************/
    //自定义的时间输入框组件
    TimeInput{
        id:textEdit
        width: parent.width
        height: parent.height
        anchors.top: parent.top
        anchors.left: parent.left
    }
    //日历控件
    Calendar{
        id:calendarItem
        width: 300
        height: 250
        anchors.top: textEdit.bottom
        anchors.left: textEdit.left
        visible: false
        onClicked: {
            visible:false
        }

    }
    Component.onCompleted: {
        //日历点击信号的信号与槽的连接
        calendarItem.clicked.connect(calendarClicked)
        textEdit.clicked.connect(showCalendar)
        //初始的默认时间为当前时间
        textEdit.strTime = currentDate.toLocaleDateString("yyyy/M/d")+" "+currentDate.toLocaleTimeString("H:mm")
        textEdit.oldTime = textEdit.strTime
    }
    /***************************************方法*******************************************/
    //显示日历界面的
    function showCalendar()
    {
        calendarItem.visible = !calendarItem.visible
    }
    //点击日历选择时间后的处理函数
    function calendarClicked(date)
    {
        var year = date.getFullYear()
        var month =date.getMonth()+1
        var day = date.getDate()

        var selectDate = year+"/"+month+"/"+day
        var timeSplit =textEdit.strTime.split(" ")
        textEdit.strTime = selectDate+" "+timeSplit[1]
        textEdit.oldTime = textEdit.strTime
    }
}

这样就是实现了TextEdit组件,在外面获取当前的时间时,可直接通过text属性获取时间文本。


  • 1
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
使用 QML实现一个应用程序需要进行以下步骤: 1. 编写 QML 文件:QML 是一种声明性语言,用于描述组件的外观和行为。通过编写 QML 文件,您可以创建一个包含各种界面元素的用户界面。 2. 创建 C++ 类并将其暴露到 QML:您可以编写 C++ 类来实现应用程序的逻辑,并将其暴露到 QML 中以便在 QML 中使用。 3. 在主函数中加载 QML 文件:在主函数中,您需要加载 QML 文件,并将其与 C++ 类及其方法关联起来。 下面是一个简单的例子: 1. 编写 QML 文件: ``` import QtQuick 2.0 Rectangle { width: 200 height: 200 color: "blue" Text { text: "Hello, world!" anchors.centerIn: parent } } ``` 2. 创建 C++ 类并将其暴露到 QML: ```cpp #include <QObject> class MyObject : public QObject { Q_OBJECT public: Q_INVOKABLE QString getMessage() const { return "Hello, world!"; } }; ``` 3. 在主函数中加载 QML 文件: ```cpp #include <QGuiApplication> #include <QQmlApplicationEngine> #include "myobject.h" int main(int argc, char *argv[]) { QGuiApplication app(argc, argv); QQmlApplicationEngine engine; MyObject myObject; engine.rootContext()->setContextProperty("myObject", &myObject); engine.load(QUrl(QStringLiteral("qrc:/main.qml"))); return app.exec(); } ``` 在上面的代码中,我们创建了一个名为 `MyObject` 的 C++ 类,并将其暴露到 QML 中。然后我们在主函数中创建了一个 `MyObject` 实例,并将其设置为 QML 上下文的属性。最后,我们加载了 `main.qml` 文件。 这是一个非常简单的例子,但它演示了如何使用 QML 和 C++ 共同实现一个应用程序。您可以通过将更多的 QML 组件和 C++ 类添加到您的应用程序中来扩展它。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值