QML学习之QML之键盘输入(基础可视项目)

TextInput

允许用户输入一行文本,元素支持输入约束,如validator,inputMask,echoMode
可以在文本输入中单机以更改焦点,使用KeyNavigation属性可以通过键盘更改焦点

import QtQuick 2.15
import QtQuick.Window 2.15
import QtQuick.Controls 2.15
Window {
    width: 640
    height: 480
    visible: true
    title: qsTr("Hello World")

    Rectangle {
        width: 200; height: 200
        color: 'linen'
        TextInput {
            id: input1
            x:8; y: 8
            width: 96;height:20
            text:'Text input 1'
            KeyNavigation.tab: input2
        }

        TextInput {
            id: input2
            x:8; y: 36
            width: 96;height:20
            text:'Text input 2'
            KeyNavigation.tab: input1
        }
    }
}

演示demo

// TLineEdit.qml
import QtQuick 2.15
import QtQuick.Controls 2.15

FocusScope {
    width: 200; height: 30
    Rectangle {
        anchors.fill: parent
        color: "blue"
        border.color: "gray"
    }
    property alias text: input.text
    property alias input: input

    TextInput {
        id: input
        anchors.fill: parent
        anchors.margins: 2
        focus: true
    }
}
// main.qml
import QtQuick 2.15
import QtQuick.Window 2.15
import QtQuick.Controls 2.15
Window {
    width: 640
    height: 480
    visible: true
    title: qsTr("Hello World")

    TLineEdit {
        id: text1
        text: "text input 1"
        height: input.font.pixelSize+10
        input.color: "white"
        focus: true
        KeyNavigation.tab: text2
    }

    TLineEdit {
        id: text2
        text: "text input 2"
        y: text1.y+text1.height+12
        height: input.font.pixelSize+10
        input.color: "white"
        KeyNavigation.tab: text1
    }
}

Keys

允许基于某些按键执行代码,例如,要移动和缩放一个正方形

演示demo

import QtQuick 2.15
import QtQuick.Window 2.15
import QtQuick.Controls 2.15
Window {
    width: 640
    height: 480
    visible: true
    title: qsTr("Hello World")
    Rectangle {
        Rectangle{
            id: square
            width: 100; height: 100
            color: 'green'
            border.color: Qt.lighter(color)
        }

        focus: true
        Keys.onLeftPressed: square.x -= 8
        Keys.onRightPressed: square.x += 8
        Keys.onUpPressed: square.y -= 8
        Keys.onDownPressed: square.y += 8
        Keys.onPressed: function (event){
            switch(event.key){
            case Qt.Key_Plus:square.scale+=0.2;break;
            case Qt.Key_Minus:square.scale-=0.2;break;
            }
        }
    }

}

TextEdit

TextEdit项目与用于显示多行文本的可编辑格式化文本,TextEdit与Qt的QTextEdit很相似,既可以显示纯文本,也可以显示富文本

import QtQuick 2.15
import QtQuick.Window 2.15
import QtQuick.Controls 2.15
Window {
    width: 640
    height: 480
    visible: true
    title: qsTr("Hello World")

    TextEdit {
        width: 200
        textFormat: Text.RichText
        text: "<b> Hello </b> <i> world </i>"
        font.family: "宋体"
        font.pointSize: 20
        color: "blue"
        focus: true
    }
}

这里将focus属性设置为true,这样可以使TextEdit项目接收键盘输入,TextEdit没有提供滚动条,光标跟随和其他可视部件中通常具有的行为,一般使用Flickable元素提供滚动条,从而实现光标跟随,更好的方式是使用TextArea

演示demo

import QtQuick 2.15
import QtQuick.Window 2.15
import QtQuick.Controls 2.15
Window {
    width: 640
    height: 480
    visible: true
    title: qsTr("Hello World")

    Item {
        width: 400;height: 300
        Flickable{
            id: flick

            anchors.fill: parent
            contentWidth: edit.paintedWidth
            contentHeight: edit.paintedHeight
            clip: true

            function ensureVisible(r)
            {
                if(contentX >= r.x)
                    contentX = r.x;
                else if (contentX+width <= r.x+r.width)
                    contentX = r.x+r.width-width;
                if(contentY >=r.y)
                    contentY = r.y
                else if(contentY+height <= r.y+r.height)
                    contentY = r.y+r.height-height;
            }

            TextEdit {
                id: edit
                width: flick.width
                height: flick.height
                font.pixelSize: 15
                wrapMode: TextEdit.Wrap
                focus: true
                onCursorRectangleChanged:
                    flick.ensureVisible(cursorRectangle)
            }
        }
        Rectangle {
            id: scrollbar
            anchors.right: flick.right
            y: flick.visibleArea.yPosition * flick.height
            width: 10
            height: flick.visibleArea.heightRatio * flick.height
            color: "lightgrey"
        }
    }
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: QWidget是Qt框架中的一个基类,用于构建传统的基于C++的GUI界面,而QML是一种用于构建现代、动态用户界面的声明性语言。在QWidget与QML结合使用时,可以借助QQuickWidget类将QML界面嵌入到QWidget中,实现二者的交互。 首先,我们需要在Qt项目中添加一个QQuickWidget部件。在QWidget的构造函数中,可以创建一个QQuickWidget对象,并将其设置为QWidget的子部件,通过设置QQuickWidget的源QML文件,可以指定要加载的QML界面。 接下来,可以在QML界面中定义一些交互的信号与槽。例如,在QML中定义一个点击按钮的信号与槽,以实现按钮点击时的反馈效果。在QML中,可以使用Signal类型定义一个信号,然后在按钮的点击事件中触发信号。在QWidget中,可以通过connect函数连接QML中定义的信号与槽,实现二者的交互。 具体实现代码如下: ```cpp // QWidget类的构造函数 MyWidget::MyWidget(QWidget *parent) : QWidget(parent) { QQuickWidget *qmlWidget = new QQuickWidget(this); qmlWidget->setSource(QUrl("qrc:/main.qml")); // 设置QML文件路径 // 定义一个槽函数,用于接收来自QML界面的信号 connect(qmlWidget->rootObject(), SIGNAL(buttonClicked()), this, SLOT(onButtonClicked())); QVBoxLayout *layout = new QVBoxLayout(this); layout->addWidget(qmlWidget); setLayout(layout); } // QWidget类的槽函数,用于处理来自QML界面的信号 void MyWidget::onButtonClicked() { qDebug() << "Button clicked!"; } ``` 在上述代码中,我们通过QQuickWidget加载了一个名为main.qmlQML文件,并连接了其定义的buttonClicked信号和MyWidget类的onButtonClicked槽函数。 这样,在QML中按钮的点击事件中触发buttonClicked信号时,MyWidget的onButtonClicked槽函数将被调用,并打印出"Button clicked!"的相关信息。 通过以上方法,我们可以在QWidget和QML之间实现信号槽的交互,实现更加复杂和灵活的用户界面交互效果。 ### 回答2: QWidget是Qt的一个基础类,用于创建可视化的窗口应用程序。而QML是一种声明性语言,用于创建用户界面。在学习QML时,我们可以将QWidget与QML结合使用,并通过信号槽机制实现二者的交互。 要在QWidget中使用QML,我们首先需要创建一个QQuickWidget对象。QQuickWidget是一个可嵌入QML内容的QWidget子类。可以通过调用setSource函数指定QML文件的路径,然后将QQuickWidget对象添加到QWidget的布局中。 在QML中,我们可以定义信号和槽函数。信号是在某些事件发生时发出的通知,而槽函数则是接收信号并执行特定操作的函数。在QML中,我们可以使用signal关键字定义信号,使用on关键字将信号连接到相应的槽函数。 在QWidget中,我们可以使用QMetaObject::connectSlotsByName函数将QML中的信号和QWidget中的槽函数进行连接。这样,当QML中的信号触发时,对应的槽函数就会被调用。 例如,假设我们在QML中定义了一个按钮,当按钮被点击时,会触发一个名为buttonClicked的信号。我们可以在QWidget中定义一个名为onButtonClicked的槽函数,并将其与QML中的buttonClicked信号进行连接。当按钮被点击时,QWidget中的onButtonClicked槽函数就会被调用。 通过QWidget与QML的结合使用,我们可以充分发挥两者的优势,实现更加灵活和交互性强的用户界面。同时,通过信号槽机制,我们可以方便地在QWidget与QML之间进行数据传递和状态更新,提高数据的实时性和可靠性。 ### 回答3: 在学习QML的过程中,我们可能需要将Qt Widgets和QML结合使用,并实现信号槽的交互。QML是一种用于创建用户界面的声明性语言,而Qt Widgets是Qt框架中用于创建传统桌面应用程序的类库。 要将QWidget与QML结合使用,我们可以使用Qt Quick Controls 2模块中的QQuickWidget类。该类允许我们将QML视图嵌入到QWidget应用程序中,以便在QMLQt Widgets之间进行交互。 首先,我们需要在Qt Widgets应用程序中创建一个QQuickWidget,并设置它要显示的QML文件路径: QQuickWidget *qmlWidget = new QQuickWidget; qmlWidget->setSource(QUrl("qrc:/qml/main.qml")); qmlWidget->setResizeMode(QQuickWidget::SizeRootObjectToView); 然后,我们可以通过将QWidget的指针传递给QML文件,来在QML中访问Qt Widgets对象。例如,在QML文件中可以这样定义一个按钮: import QtQuick.Controls 2.15 Button { id: myButton text: "Click me" onClicked: { // 调用Qt Widgets中的槽函数 myWidget.mySlot() } } 这里,我们假设QWidget类的对象被指定为myWidget。在按钮的onClicked信号中,我们可以调用myWidget对象的名为mySlot的槽函数。 要实现从QMLQt Widgets的信号传递,我们需要在QWidget的代码中定义一个槽函数,并在QML中使用Qt信号。例如,在QWidget的头文件中定义一个槽函数: public slots: void mySlot(); 然后,在QML文件中,可以这样发出信号: import QtQuick.Controls 2.15 Button { id: myButton text: "Click me" onClicked: { // 发出信号 mySignal() } } 这里,我们定义了一个名为mySignal的信号。在QML中的点击事件中,我们发出了该信号。 在QWidget类的代码中,我们可以连接这个信号到一个槽函数,以便执行相应的操作。例如: connect(myQmlWidget->rootObject(), SIGNAL(mySignal()), this, SLOT(mySlot())); 通过这种方式,我们可以在QWidget和QML之间建立信号槽的交互,实现二者之间的通信。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值