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