texteditor.qml Example File
texteditor/qml/texteditor.qml
import QtQuick 2.8
import QtQuick.Controls 2.1
import QtQuick.Window 2.0
import Qt.labs.platform 1.0
import io.qt.examples.texteditor 1.0
ApplicationWindow {
id: window
width: 1024
height: 600
visible: true
title: document.fileName + " - Text Editor Example"
Component.onCompleted: {
x = Screen.width / 2 - width / 2
y = Screen.height / 2 - height / 2
}
Shortcut {
sequence: StandardKey.Open
onActivated: openDialog.open()
}
Shortcut {
sequence: StandardKey.SaveAs
onActivated: saveDialog.open()
}
Shortcut {
sequence: StandardKey.Quit
onActivated: Qt.quit()
}
Shortcut {
sequence: StandardKey.Copy
onActivated: textArea.copy()
}
Shortcut {
sequence: StandardKey.Cut
onActivated: textArea.cut()
}
Shortcut {
sequence: StandardKey.Paste
onActivated: textArea.paste()
}
Shortcut {
sequence: StandardKey.Bold
onActivated: document.bold = !document.bold
}
Shortcut {
sequence: StandardKey.Italic
onActivated: document.italic = !document.italic
}
Shortcut {
sequence: StandardKey.Underline
onActivated: document.underline = !document.underline
}
MenuBar {
Menu {
title: qsTr("&File")
MenuItem {
text: qsTr("&Open")
onTriggered: openDialog.open()
}
MenuItem {
text: qsTr("&Save As...")
onTriggered: saveDialog.open()
}
MenuItem {
text: qsTr("&Quit")
onTriggered: Qt.quit()
}
}
Menu {
title: qsTr("&Edit")
MenuItem {
text: qsTr("&Copy")
enabled: textArea.selectedText
onTriggered: textArea.copy()
}
MenuItem {
text: qsTr("Cu&t")
enabled: textArea.selectedText
onTriggered: textArea.cut()
}
MenuItem {
text: qsTr("&Paste")
enabled: textArea.canPaste
onTriggered: textArea.paste()
}
}
Menu {
title: qsTr("F&ormat")
MenuItem {
text: qsTr("&Bold")
checkable: true
checked: document.bold
onTriggered: document.bold = !document.bold
}
MenuItem {
text: qsTr("&Italic")
checkable: true
checked: document.italic
onTriggered: document.italic = !document.italic
}
MenuItem {
text: qsTr("&Underline")
checkable: true
checked: document.underline
onTriggered: document.underline = !document.underline
}
}
}
FileDialog {
id: openDialog
fileMode: FileDialog.OpenFile
selectedNameFilter.index: 1
nameFilters: ["Text files (*.txt)", "HTML files (*.html *.htm)"]
folder: StandardPaths.writableLocation(StandardPaths.DocumentsLocation)
onAccepted: document.load(file)
}
FileDialog {
id: saveDialog
fileMode: FileDialog.SaveFile
defaultSuffix: document.fileType
nameFilters: openDialog.nameFilters
selectedNameFilter.index: document.fileType === "txt" ? 0 : 1
folder: StandardPaths.writableLocation(StandardPaths.DocumentsLocation)
onAccepted: document.saveAs(file)
}
FontDialog {
id: fontDialog
onAccepted: {
document.fontFamily = font.family;
document.fontSize = font.pointSize;
}
}
ColorDialog {
id: colorDialog
currentColor: "black"
}
MessageDialog {
id: errorDialog
}
header: ToolBar {
leftPadding: 8
Flow {
id: flow
width: parent.width
Row {
id: fileRow
ToolButton {
id: openButton
text: "\uF115"
font.family: "fontello"
onClicked: openDialog.open()
}
ToolSeparator {
contentItem.visible: fileRow.y === editRow.y
}
}
Row {
id: editRow
ToolButton {
id: copyButton
text: "\uF0C5"
font.family: "fontello"
focusPolicy: Qt.TabFocus
enabled: textArea.selectedText
onClicked: textArea.copy()
}
ToolButton {
id: cutButton
text: "\uE802"
font.family: "fontello"
focusPolicy: Qt.TabFocus
enabled: textArea.selectedText
onClicked: textArea.cut()
}
ToolButton {
id: pasteButton
text: "\uF0EA"
font.family: "fontello"
focusPolicy: Qt.TabFocus
enabled: textArea.canPaste
onClicked: textArea.paste()
}
ToolSeparator {
contentItem.visible: editRow.y === formatRow.y
}
}
Row {
id: formatRow
ToolButton {
id: boldButton
text: "\uE800"
font.family: "fontello"
focusPolicy: Qt.TabFocus
checkable: true
checked: document.bold
onClicked: document.bold = !document.bold
}
ToolButton {
id: italicButton
text: "\uE801"
font.family: "fontello"
focusPolicy: Qt.TabFocus
checkable: true
checked: document.italic
onClicked: document.italic = !document.italic
}
ToolButton {
id: underlineButton
text: "\uF0CD"
font.family: "fontello"
focusPolicy: Qt.TabFocus
checkable: true
checked: document.underline
onClicked: document.underline = !document.underline
}
ToolButton {
id: fontFamilyToolButton
text: qsTr("\uE808")
font.family: "fontello"
font.bold: document.bold
font.italic: document.italic
font.underline: document.underline
onClicked: {
fontDialog.currentFont.family = document.fontFamily;
fontDialog.currentFont.pointSize = document.fontSize;
fontDialog.open();
}
}
ToolButton {
id: textColorButton
text: "\uF1FC"
font.family: "fontello"
focusPolicy: Qt.TabFocus
onClicked: colorDialog.open()
Rectangle {
width: aFontMetrics.width + 3
height: 2
color: document.textColor
parent: textColorButton.contentItem
anchors.horizontalCenter: parent.horizontalCenter
anchors.baseline: parent.baseline
anchors.baselineOffset: 6
TextMetrics {
id: aFontMetrics
font: textColorButton.font
text: textColorButton.text
}
}
}
ToolSeparator {
contentItem.visible: formatRow.y === alignRow.y
}
}
Row {
id: alignRow
ToolButton {
id: alignLeftButton
text: "\uE803"
font.family: "fontello"
focusPolicy: Qt.TabFocus
checkable: true
checked: document.alignment == Qt.AlignLeft
onClicked: document.alignment = Qt.AlignLeft
}
ToolButton {
id: alignCenterButton
text: "\uE804"
font.family: "fontello"
focusPolicy: Qt.TabFocus
checkable: true
checked: document.alignment == Qt.AlignHCenter
onClicked: document.alignment = Qt.AlignHCenter
}
ToolButton {
id: alignRightButton
text: "\uE805"
font.family: "fontello"
focusPolicy: Qt.TabFocus
checkable: true
checked: document.alignment == Qt.AlignRight
onClicked: document.alignment = Qt.AlignRight
}
ToolButton {
id: alignJustifyButton
text: "\uE806"
font.family: "fontello"
focusPolicy: Qt.TabFocus
checkable: true
checked: document.alignment == Qt.AlignJustify
onClicked: document.alignment = Qt.AlignJustify
}
}
}
}
DocumentHandler {
id: document
document: textArea.textDocument
cursorPosition: textArea.cursorPosition
selectionStart: textArea.selectionStart
selectionEnd: textArea.selectionEnd
textColor: colorDialog.color
Component.onCompleted: document.load("qrc:/texteditor.html")
onLoaded: {
textArea.text = text
}
onError: {
errorDialog.text = message
errorDialog.visible = true
}
}
Flickable {
id: flickable
flickableDirection: Flickable.VerticalFlick
anchors.fill: parent
TextArea.flickable: TextArea {
id: textArea
textFormat: Qt.RichText
wrapMode: TextArea.Wrap
focus: true
selectByMouse: true
persistentSelection: true
leftPadding: 6
rightPadding: 6
topPadding: 0
bottomPadding: 0
background: null
MouseArea {
acceptedButtons: Qt.RightButton
anchors.fill: parent
onClicked: contextMenu.open()
}
onLinkActivated: Qt.openUrlExternally(link)
}
ScrollBar.vertical: ScrollBar {}
}
Menu {
id: contextMenu
MenuItem {
text: qsTr("Copy")
enabled: textArea.selectedText
onTriggered: textArea.copy()
}
MenuItem {
text: qsTr("Cut")
enabled: textArea.selectedText
onTriggered: textArea.cut()
}
MenuItem {
text: qsTr("Paste")
enabled: textArea.canPaste
onTriggered: textArea.paste()
}
MenuSeparator {}
MenuItem {
text: qsTr("Font...")
onTriggered: fontDialog.open()
}
MenuItem {
text: qsTr("Color...")
onTriggered: colorDialog.open()
}
}
}