Qt5.7 QML QtQuick;如何为桌面和 Android 构建可滚动和可编辑的 TextArea

标签 qt qml qt5.7 qtquickcontrols2

使用 QtQuick Controls.2,您可以通过将 TextArea 放入 Flickable 中来使其可滚动,但随后您无法选择文本(因为尝试选择会启动滚动) )。但是,如果您将其设置为selectByMouse,则可以选择,但无法滚动。

如何同时做到这两点?

这是我的示例代码:

import QtQuick 2.7
import QtQuick.Controls 2.0
import QtQml 2.2

ApplicationWindow
{
    visible: true
    width: 640
    height: 800

    function makeText()
    {
        var s = "click <a href=\"http://qt.io\">here</a>\n"
        for (var i = 0; i < 10; ++i)
        {
            s += 
"<p>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Cras at tempus felis. Nulla facilisi. Duis quam purus, posuere eu rutrum vel, blandit quis lorem. Cras vitae orci eget lorem luctus cursus quis nec nibh. Sed luctus ligula urna, vel commodo nisi finibus quis. Donec pretium eu purus a porttitor. Nam vehicula nunc quis dui gravida luctus. Morbi fermentum, elit nec ullamcorper accumsan, ex ligula iaculis nisi, id pretium ipsum metus quis quam. In lobortis dignissim semper. Aenean at neque lorem. Maecenas dapibus, arcu a condimentum consequat, mauris enim vehicula nibh, in fringilla quam nisi eu ipsum.</p>"
        }
        return s
    }

    Flickable 
    {
        id: flickable
        anchors.fill: parent
        flickableDirection: Flickable.VerticalFlick

        // place a TextArea inside the flickable, you can edit text
        // but you cannot select because click & move mouse flicks the view.
        TextArea.flickable: TextArea
        {
            id: textarea
            wrapMode: TextArea.Wrap

            font.pointSize: 16
            textMargin: 16
            textFormat: TextEdit.RichText

            // can select but kills scrolling
            //selectByMouse: true

            text: Qt.platform.os + "\n" + makeText()

            // try out links
            onLinkActivated: Qt.openUrlExternally(link)
        }
        ScrollBar.vertical: ScrollBar { }
    }
}

解决这个问题的最佳方法是什么,是否有一个固定的答案(因为应该有!)。

我尝试实现一个想法,您可以使用 PressAndHold 执行选择。它在某种程度上可以工作,但很繁琐。这是一个好主意吗?这里的最佳实践是什么。

另一件事是,Controls.2 现在没有弹出剪切和粘贴菜单,即使对于桌面也会出现。

这是否意味着我必须实现:

  1. 滚动选择的方法
  2. 桌面剪切和粘贴菜单
  3. 适用于 Android 的剪切和粘贴菜单(没有快捷键)
  4. Android 选择 handle
  5. Android 的光标点句柄

我很惊讶地发现这些都没有在所谓的 EditArea 控件中提供!

这里有任何建议/引用实现或建议。

顺便说一句,Controls.1 中也缺少 3,4 和 5

项目文件:https://gist.github.com/anonymous/1ad94c9539fdc51d29258f6164f72487

谢谢。

最佳答案

不幸的是,在 Qt 5.7.0 版本发布之前,Android 尚未及时完成通过 Qt 平台抽象层提供的正确文本选择支持。在这个领域,iOS 和嵌入式 Linux 得到了更好的覆盖。 Android 方面的任何进展都可以通过 https://bugreports.qt.io/browse/QTBUG-34867 进行监控.

关于Qt5.7 QML QtQuick;如何为桌面和 Android 构建可滚动和可编辑的 TextArea,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37883059/

相关文章:

c++ - 禁用来自 .tags 文件的警告

Qt5.7 qmake; "The system cannot find the path specified."是什么意思以及如何修复它?

python - 如何在 PyQt/PySide 中表征 createIndex 的 "pointer"参数?

qt - QString::arg()的参数中如何处理 “%1”?

qt - 找不到有效的设置文件

qt - 在数组元素上使用绑定(bind)时出现奇怪的绑定(bind)行为

qt - 如何访问其他 QML 文件中的 "ApplicationWindow"引用?

c++ - Qt QML listview布局不调整大小

c++ - 强制系统 QT 库使用应用程序附带的 openssl 库