1. [C++]Creare un notepad

    Tags
    cpp
    By Saffo´ il 26 Mar. 2013
     
    0 Comments   152 Views
    .
    "Cosa? Saffo crea un altro notepad? Ma basta con 'sti notepad eh, io voglio conquistare il mondo!" (Tipica frase dell'informatico medio che accede a questo topic)

    Fatta la premessa (e che premessa), in questo tutorial vorrei vedere con voi come creare un simpatico notepad sfruttando la libreria Qt (qt.digia.com) e utilizzando il nuovo stile Fusion (per chi non è pratico di QT, dico velocemente che prima erano disponibili molti più stili, ora unificati sotto Fusion).
    Per prima cosa, creiamo un nuovo progetto QApplication, che io chiamerò GFN (ovvero "Good for Nothing", "Buono a nulla" :asd:) e definiamo la struttura del software, facendo doppio click su mainwindow.ui e accedendo così al designer. Per semplicità, vi posto direttamente il codice XML del form, a voi basta clikkare su edit per poterlo modificare:

    CODICE
    <?xml version="1.0" encoding="UTF-8"?>
    <ui version="4.0">
    <class>MainWindow</class>
    <widget class="QMainWindow" name="MainWindow">
     <property name="geometry">
      <rect>
       <x>0</x>
       <y>0</y>
       <width>400</width>
       <height>300</height>
      </rect>
     </property>
     <property name="windowTitle">
      <string>Good For Nothing</string>
     </property>
     <property name="windowIcon">
      <iconset>
       <normaloff>icon.ico</normaloff>icon.ico</iconset>
     </property>
     <property name="styleSheet">
      <string notr="true"/>
     </property>
     <widget class="QWidget" name="centralWidget">
      <widget class="QTextEdit" name="textEdit">
       <property name="geometry">
        <rect>
         <x>10</x>
         <y>10</y>
         <width>381</width>
         <height>261</height>
        </rect>
       </property>
      </widget>
     </widget>
     <widget class="QMenuBar" name="menuBar">
      <property name="geometry">
       <rect>
        <x>0</x>
        <y>0</y>
        <width>400</width>
        <height>21</height>
       </rect>
      </property>
      <widget class="QMenu" name="menu_File">
       <property name="title">
        <string>&amp;File</string>
       </property>
       <addaction name="actionProcessa"/>
       <addaction name="actionSalva"/>
       <addaction name="separator"/>
       <addaction name="actionEsci"/>
      </widget>
      <widget class="QMenu" name="menu">
       <property name="title">
        <string>&amp;?</string>
       </property>
       <addaction name="actionAbout"/>
      </widget>
      <addaction name="menu_File"/>
      <addaction name="menu"/>
     </widget>
     <action name="actionProcessa">
      <property name="text">
       <string>Apri...</string>
      </property>
     </action>
     <action name="actionEsci">
      <property name="text">
       <string>Esci</string>
      </property>
     </action>
     <action name="actionAbout">
      <property name="text">
       <string>About</string>
      </property>
     </action>
     <action name="actionSalva">
      <property name="text">
       <string>Salva...</string>
      </property>
     </action>
    </widget>
    <layoutdefault spacing="6" margin="11"/>
    <resources/>
    <connections/>
    </ui>

    In poche parole, un semplice form principale con una TextEdit al centro e 4 pulsanti sulla barra (Apri, Salva, Esci, About). Facendo click con il destro sugli events di tali pulsanti, è possibile collegare i loro segnali trigged con del codice, in questo modo:

    e facendo doppio click su "trigged()". Possiamo quindi aggiungere ad ogni tasto il suo codice:
    CODICE
    void MainWindow::on_actionEsci_triggered()
    {
       qApp->quit();
    }

    void MainWindow::on_actionAbout_triggered()
    {
       QMessageBox::about(this, tr("About"), tr("Creato da Saffo, Copyright 2013."));
    }

    void MainWindow::on_actionProcessa_triggered()
    {
       QString fileName = QFileDialog::getOpenFileName(this, tr("Apri un file"), QString(), tr("File di testo (*.txt);; Tutti i files (*.*)"));
       if(!fileName.isEmpty()) {
           QFile file(fileName);
           if(!file.open(QIODevice::ReadOnly)) {
               QMessageBox::critical(this, tr("Errore"), tr("Impossibile aprire il file"));
               return;
           }
           QTextStream in(&file);
           ui->textEdit->setText(in.readAll());
           file.close();
       }
    }

    void MainWindow::on_actionSalva_triggered()
    {
       QString fileName = QFileDialog::getSaveFileName(this, tr("Salva con nome"), QString(), tr("File di testo (*.txt);; Tutti i files (*.*)"));
       if(!fileName.isEmpty()) {
           QFile file(fileName);
           if(!file.open(QIODevice::WriteOnly)) {
               QMessageBox::critical(this, tr("Errore"), tr("Impossibile salvare il file"));
               return;
           }
           QTextStream in(&file);
           in << ui->textEdit->toPlainText();
           in.flush();
           file.close();
       }
    }

    (Vi consiglio di pensarci due volte prima di fare copia&incolla: se non fate tutte le volte l'operazione sopra descritta il programma non funzionerà ;) ) (ricordatevi di includere QFile, QFileDialog, QMessageBox, QTextStream)

    Il programma è ora perfettamente funzionante, ma noi vogliamo aggiungervi un tocco di stile; iniziamo impedendo all'utente di poter ingrandire la finestra modificando il MainWindow:
    CODICE
    ui->setupUi(this);
       Qt::WindowFlags flags;
       flags = Qt::Window | Qt::WindowMinimizeButtonHint | Qt::WindowCloseButtonHint;
       setWindowFlags( flags );

    Possiamo continuare aggiungendo un'icona: inserite un file .ico (icon.ico) nella cartella del progetto e aggiungete un file .rc con il seguente codice:
    CODICE
    IDI_ICON1 ICON DISCARDABLE "icon.ico"

    Nel file .pro, invece, aggiungete la dichiarazione del file di risorse:
    CODICE
    RC_FILE = gfn.rc

    Se compilerete dunque in release mode, al programma verrà aggiunta anche l'icona.

    Infine, come promesso, nel main.cpp aggiungiamo la dichiarazione dello stile fusion, semplicemente aggiungendo:
    CODICE
    QApplication::setStyle("fusion");


    Il risultato finale è


    Sulla base di questo, potrete allenarvi aggiungendo due semplicissime funzioni:

    • Fare in modo che appaia il nome del file aperto/salvato nella barra del titolo

    • Creare un'opzione "Nuovo" nel menu (che resetta anche il titolo)

      Share  
     
    .