qml实现简单记事本程序
来源:互联网 发布:沪昆高铁偷工减料知乎 编辑:程序博客网 时间:2024/05/16 10:55
最近自学qml,尝试用qml写个小程序,熟悉qml简单用法
#ifndef FILERWRITER#define FILERWRITER#include <QQuickTextDocument>#include <QtGui/QTextCharFormat>#include <QtCore/QTextCodec>#include <qqmlfile.h>#include<QFile>#include<QObject>//该类主要实现文件的读写功能class FileRWritter:public QObject{ Q_OBJECT Q_PROPERTY(QString m_fileName READ getFileName WRITE setFileName)public: FileRWritter(QObject *parent= NULL); //QString filename, // void saveFile(QString filedata); // QString readFile(); Q_INVOKABLE void saveFile(QString filedata); Q_INVOKABLE QString readFile(); QString getFileName(); void setFileName(QString filename);private: QString m_fileName;};#endif // FILERWRITER
#include "filerwriter.h"#include <QByteArray>#include<QString>#include<QMessageBox>FileRWritter::FileRWritter(QObject *parent):QObject(parent){ // if(filename.isEmpty()) // { // return; // } // m_fileName = filename; QString filename ,}void FileRWritter::saveFile(QString filedata){ if(filedata.isEmpty()) { return; } // int index = m_fileName.lastIndexOf(":"); QString filePath =m_fileName.right(m_fileName.length() - 8); QFile file(filePath); if(file.exists()) { file.remove(); } if(!file.open(QIODevice::ReadWrite)) { QMessageBox::information(NULL,"提示","文件打开失败"+filePath); return; } int length = file.write(filedata.toStdString().data()); if(length != filedata.length()) { QMessageBox::information(NULL,"提示","保存失败"); } file.close();}QString FileRWritter::readFile(){ QString filePath =m_fileName.right(m_fileName.length() - 8); QFile file(filePath); if(!file.open(QIODevice::ReadWrite)) { QMessageBox::information(NULL,"提示","文件打开失败"+filePath); return ""; } QByteArray filedata = file.readAll(); file.close(); return filedata;}QString FileRWritter::getFileName(){ return m_fileName;}void FileRWritter::setFileName(QString filename){ m_fileName = filename;}
#include <QApplication>#include <QQmlApplicationEngine>#include "filerwriter.h"#include <QtQml>int main(int argc, char *argv[]){ QApplication app(argc, argv); QQmlApplicationEngine engine;
//为了能在qml中使用上面写的c++类<span style="font-family: Arial, Helvetica, sans-serif; font-size: 12px;">FileRWritter,必须进行注册</span>
qmlRegisterType<FileRWritter>("com.mytexteditor.filerwritter", 1, 0, "FileRWritter"); engine.load(QUrl(QStringLiteral("qrc:/main.qml"))); return app.exec();}
import QtQuick 2.4import QtQuick.Controls 1.3import QtQuick.Window 2.2import QtQuick.Dialogs 1.2import QtQuick.Controls 1.2;import QtQuick.Layouts 1.1import QtQuick.Controls.Styles 1.3import com.mytexteditor.filerwritter 1.0ApplicationWindow { title: qsTr("TextEditor") width: 640 height: 480 visible: true id:mainwindowid; property string filepath: ""; toolBar:ToolBar { RowLayout { ToolButton { text:"复制"; // iconSource: "image/1.png" onClicked: textareaid.copy(); } ToolButton { text:"粘贴" onClicked: textareaid.paste(); } ToolButton { text:"剪切"; onClicked: textareaid.cut(); } ToolButton { text:"撤销"; onClicked: textareaid.undo(); } ToolButton { text:"字体颜色" onClicked: colorDialog.open(); } }}menuBar: MenuBar { Menu { title: qsTr("文件(&F)") MenuItem { text: qsTr("新建") shortcut: "Ctrl+N" onTriggered: newFile(); } MenuItem { text: qsTr("打开") shortcut: "Ctrl+O" onTriggered: openfileDialog.open(); } MenuItem { text: qsTr("保存") shortcut: "Ctrl+S" onTriggered: saveFile(); } // MenuItem { // text: qsTr("另存为") //shortcut: "Ctrl+A" // } MenuSeparator{} MenuItem { text: qsTr("退出") shortcut: "Ctrl+Q" onTriggered: Qt.quit(); } } Menu { title: qsTr("编辑(&E)") MenuItem { text: qsTr("撤销") shortcut: "Ctrl+Z" onTriggered: textareaid.undo(); } MenuSeparator{} MenuItem { text: qsTr("复制") shortcut: "Ctrl+C" onTriggered: textareaid.copy(); } MenuItem { text: qsTr("剪切") onTriggered: textareaid.cut(); shortcut: "Ctrl+X" } MenuItem { text: qsTr("粘贴") shortcut: "Ctrl+V" onTriggered: textareaid.paste(); } MenuItem { text: qsTr("删除") shortcut: "Del" onTriggered: textareaid.remove(textareaid.selectionStart,textareaid.selectionEnd); } MenuSeparator{} MenuItem { text: qsTr("查找") shortcut: "Ctrl+F" onTriggered:findtextdlg.visible = true; } MenuItem { text: qsTr("查找下一个") // shortcut: "Ctrl+X" } MenuItem { text: qsTr("替换") shortcut: "Ctrl+H" } MenuItem { text: qsTr("转到") shortcut: "Ctrl+G" onTriggered: ; } MenuSeparator{} MenuItem { text: qsTr("全选") shortcut: "Ctrl+A"; onTriggered: textareaid.selectAll(); } MenuItem { text: qsTr("日期/时间") onTriggered: textareaid.insert(textareaid.cursorPosition,Qt.formatDateTime(new Date(), "dddd yyyy-MM-dd MMM hh-mm-ss")) // shortcut: "Ctrl+X" } } Menu { title: qsTr("格式(&O)") MenuItem { id:autoReturnMenuid; text: qsTr("自动换行") //shortcut: "Ctrl+Z" checkable: true; onTriggered: setStatusBarState(); } MenuItem { text: qsTr("字体") //shortcut: "Ctrl+C" onTriggered: fontDialog.open(); } } Menu { title: qsTr("查看(&V)") MenuItem { id:showStatusBarMenuid; text: qsTr("状态栏") //shortcut: "Ctrl+Z" checkable: true; onTriggered: setStatusBarState(); } } Menu { title: qsTr("关于(&V)") MenuItem { text: qsTr("关于记事本") onTriggered: aboutapp(); } }}statusBar: StatusBar { id:statusbarid; visible: false; RowLayout { // anchors.fill: parent Label { text: "" id:statuslabel; } Rectangle { width: 100; height: parent.height; color: "red"; } Label { text: "555" id:positionlabel; } } }function openFile(){}function aboutapp(){ aboutappdialog.visible = true;}function setTextColor(){ textareaid.textColor = colorDialog.color;}function setStatusBarState(){ positionlabel.text = textareaid.cursorPosition; if(autoReturnMenuid.checked) { statusbarid.visible = false; showStatusBarMenuid.enabled=false; } else { showStatusBarMenuid.enabled=true; if(showStatusBarMenuid.checked) { statusbarid.visible = true; } else { statusbarid.visible = false; } }}function setTextFont(){ textareaid.font = fontDialog.font;}function clearTextArea(){ textareaid.selectAll(); textareaid.remove(0,textareaid.cursorPosition);}function newFile(){ // if(textareaid.saved) // { // clearTextArea(); // } // else if(textareaid.saved==false && textareaid.text.length > 0) { messageDialog.open(); } clearTextArea(); mainwindowid.filepath="";}function saveFile(){ if(mainwindowid.filepath.length==0) { fileDialog.open(); } else { filerwritterid.m_fileName = mainwindowid.filepath; filerwritterid.saveFile(textareaid.text); } textareaid.saved = true;}function changeCaseSensitiveState(){ if(casecheckid.checked) { findtextdlg.casesensitve = true; } else { findtextdlg.casesensitve = false; }}function changeFindTextWard(){ if(upbuttonid.checked) { findtextdlg.upward = true; } else if(donwbuttonid.checked) { findtextdlg.upward = false; }}function findNextText(){ if( findtextdlg.index === -1 || textareaid.text.length == 0) { return; } var start_index = 0; if(findtextdlg.index > 0) { start_index = findtextdlg.index+textfieldid.text.length; if(findtextdlg.upward) { start_index = findtextdlg.index; } } else if(findtextdlg.upward ) { start_index = textareaid.text.length; } console.log("startindex :"+start_index) var contentstr; var findText ; if(findtextdlg.casesensitve == true) { contentstr = textareaid.text.substring(start_index); if(findtextdlg.upward) { contentstr = textareaid.text.substring(0,start_index).trim(); } findText = textfieldid.text; } else { contentstr = textareaid.text.substring(start_index).toLowerCase(); if(findtextdlg.upward) { contentstr = textareaid.text.substring(0,start_index).toLowerCase().trim(); } findText = textfieldid.text.toLowerCase(); } console.log("contentstr :"+contentstr) if(contentstr.length == 0) { return; } var index = contentstr.indexOf(findText); if(findtextdlg.upward) { index = contentstr.lastIndexOf(findText); } console.log("index :"+index) if(index < 0 ) { completeFindDialog.open(); findtextdlg.index = -1; return; } var old_index = findtextdlg.index; var select_start = old_index+index+textfieldid.text.length; var select_end = textfieldid.text.length+old_index+textfieldid.text.length+index; if(old_index == 0) { select_start = old_index+index; select_end = old_index+textfieldid.text.length+index; } else if(findtextdlg.upward) { select_start = index; select_end = textfieldid.text.length+index; } console.log("select_start :"+select_start) console.log("select_end :"+select_end) textareaid.select(select_start,select_end); findtextdlg.index = old_index+index+textfieldid.text.length; if(findtextdlg.upward) { findtextdlg.index = index; } console.log("findtextdlg.index :"+findtextdlg.index) if((findtextdlg.upward && index === 0)) { completeFindDialog.open(); findtextdlg.index = -1; return; }}function changeButtonState(){ if(textfieldid.text.length != 0) { findnextid.enabled=true; } else { findnextid.enabled=false; }}function reject(){ findtextdlg.index= 0; findtextdlg.casesensitve =false; findtextdlg.upward= false; findtextdlg.close(); casecheckid.checked = false; upbuttonid.checked = false; donwbuttonid.checked = true; textfieldid.text = ""; console.log("close dialog")}ColorDialog { id: colorDialog title: "Please choose a color" onAccepted: { setTextColor(); } onRejected: { // console.log("Canceled") // Qt.quit() } //Component.onCompleted: visible = true}FontDialog { id: fontDialog title: "Please choose a font" font: Qt.font({ family: "Arial", pointSize: 24, weight: Font.Normal }) onAccepted: { setTextFont(); } onRejected: { console.log("Canceled") // Qt.quit() }}FileDialog { id: openfileDialog title: "选择文件" selectExisting:true; nameFilters: [ " files (*.txt )", "All files (*)" ] onAccepted: { var filename = openfileDialog.fileUrl; filerwritterid.m_fileName = filename; var filedata = filerwritterid.readFile(); textareaid.text = filedata; mainwindowid.filepath = filename; }}FileDialog { id: fileDialog title: "选择保存路径" selectExisting:false; nameFilters: [ " files (*.txt )", "All files (*)" ] onAccepted: { var filename = fileDialog.fileUrl; filerwritterid.m_fileName = filename; filerwritterid.saveFile(textareaid.text); mainwindowid.filepath = filename; }}MessageDialog { id: messageDialog title: "提示" text: "是否需要保存?" standardButtons:StandardButton.Yes|StandardButton.No onYes: { saveFile(); } onNo: { textareaid.saved = true; newFile(); } visible: false;}MessageDialog{ id:aboutappdialog title: "关于程序" text:"该程序主要实现简单的记事本功能,写该程序的目的是为了解qml的用法"}MessageDialog { id: completeFindDialog title: "提示" text: "查找完毕" standardButtons:StandardButton.Yes onYes: { close() } onNo: { close() } visible: false;}Dialog{ id:findtextdlg visible: false; property int index: 0; property bool casesensitve :false; property bool upward: false;contentItem: RowLayout { Layout.maximumWidth: 300; Layout.maximumHeight: 100; // anchors.fill: parent; ColumnLayout { RowLayout { Label { text: "查找内容" } TextField { id:textfieldid; placeholderText: qsTr("输入要查找的内容"); onTextChanged: changeButtonState(); } } RowLayout { CheckBox { id:casecheckid; text:"区分大小写" onCheckedChanged: changeCaseSensitiveState(); } GroupBox { title: "方向" RowLayout { ExclusiveGroup { id: tabPositionGroup } RadioButton { id:upbuttonid; text: "向上" checked: false exclusiveGroup: tabPositionGroup onCheckedChanged: changeFindTextWard(); } RadioButton { id:donwbuttonid; text: "向下" exclusiveGroup: tabPositionGroup onCheckedChanged: changeFindTextWard(); checked: true; } } } } } ColumnLayout { Button { id:findnextid; text:"查找下一个" onClicked: findNextText(); enabled: false; } Button { id:cancelid; text:"取消" onClicked: reject(); } } } onVisibleChanged: closedlg(); //standardButtons: StandardButton.Save | StandardButton.Cancel}function closedlg(){ if(findtextdlg.visible == false) { reject(); }}TextArea{ property bool saved: false; id:textareaid; anchors.fill: parent; onCursorPositionChanged: setStatusBarState(); onTextChanged: saved=false; // verticalScrollBarPolicy:Qt.ScrollBarAlwaysOff}FileRWritter{ id:filerwritterid; m_fileName: "";}}
0 0
- qml实现简单记事本程序
- java实现的简单记事本程序
- 简单记事本程序
- 简单的记事本程序
- Qt实现简单记事本
- Java简单记事本实现
- 记事本简单实现思路
- JavaSE写的记事本程序,实现了简单的功能
- qml-------------实现一个简单的图片加载程序
- 简单记事本程序菜单设计
- c#简单实现记事本功能
- 简单记事本实现(2)
- php实现简单记事本功能
- QML小结1-(一个简单的qml程序)
- QML小结1-(一个简单的qml程序)
- 黑马程序员_java小程序——实现简单记事本的打开保存功能
- 完成了简单记事本程序的编写
- 一个简单的记事本小程序源码
- 关系型数据库的理解
- 签到题
- 解决virtualbox只能安装32bit的问题
- hdu 5569(dp)
- Nim GameMy
- qml实现简单记事本程序
- Codeforces Round #333 Lipshitz Sequence 优先队列
- Java之Jacob调用COM接口DLL-----------------------------------dm。dll
- 跨浏览器的事件对象
- 真·为WordPress添加自机LaTeX支持(LaTeX for WordPress+MathJax)
- Linux僵尸进程
- hibernate学习笔记(一)hibernate应用背景(为什么要用hibernate)
- 数据结构之栈
- axis生成web服务