diff options
author | Nico Vertriest <nico.vertriest@qt.io> | 2017-11-13 11:54:48 +0100 |
---|---|---|
committer | Topi Reiniƶ <topi.reinio@qt.io> | 2017-12-18 13:39:28 +0000 |
commit | 51a956366f5f39799759d317e675da11a09744c5 (patch) | |
tree | e8165e69ebd131d615e258efa64e1aea476af372 /examples/widgets | |
parent | 3dd030863435e058468df66c696e1608b71e1fd2 (diff) |
Doc: move notepad example to qtbase and improve it
- Edited gettingstartedqt.qdoc
- update .pro files
- replaced snippet statements by \quotefromfile
- removed second version of notepad.h and notepad.cpp
that were made only for quoting snippets
(\quotefromfile reads from the program code)
- show current filename in header of window
- added checking routine on filename in Save method
Task-number: QTBUG-63984
Change-Id: I5298d761763a4dfeb705a1d9b77354be853ada88
Reviewed-by: Topi Reiniƶ <topi.reinio@qt.io>
Diffstat (limited to 'examples/widgets')
29 files changed, 1152 insertions, 1 deletions
diff --git a/examples/widgets/doc/images/notepad.png b/examples/widgets/doc/images/notepad.png Binary files differnew file mode 100644 index 0000000000..40d13269b9 --- /dev/null +++ b/examples/widgets/doc/images/notepad.png diff --git a/examples/widgets/doc/images/notepad1.png b/examples/widgets/doc/images/notepad1.png Binary files differnew file mode 100644 index 0000000000..40d13269b9 --- /dev/null +++ b/examples/widgets/doc/images/notepad1.png diff --git a/examples/widgets/doc/images/notepad2.png b/examples/widgets/doc/images/notepad2.png Binary files differnew file mode 100644 index 0000000000..9cec1f9a58 --- /dev/null +++ b/examples/widgets/doc/images/notepad2.png diff --git a/examples/widgets/doc/images/notepad3.png b/examples/widgets/doc/images/notepad3.png Binary files differnew file mode 100644 index 0000000000..426861ab06 --- /dev/null +++ b/examples/widgets/doc/images/notepad3.png diff --git a/examples/widgets/doc/images/notepad4.png b/examples/widgets/doc/images/notepad4.png Binary files differnew file mode 100644 index 0000000000..fc08eab204 --- /dev/null +++ b/examples/widgets/doc/images/notepad4.png diff --git a/examples/widgets/doc/images/notepad_menu.png b/examples/widgets/doc/images/notepad_menu.png Binary files differnew file mode 100644 index 0000000000..2dd771111a --- /dev/null +++ b/examples/widgets/doc/images/notepad_menu.png diff --git a/examples/widgets/tutorials/gettingstartedqt.qdoc b/examples/widgets/tutorials/gettingstartedqt.qdoc new file mode 100644 index 0000000000..921dd7a32d --- /dev/null +++ b/examples/widgets/tutorials/gettingstartedqt.qdoc @@ -0,0 +1,559 @@ +/**************************************************************************** +** +** Copyright (C) 2017 The Qt Company Ltd. +** Contact: https://www.qt.io/licensing/ +** +** This file is part of the documentation of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:FDL$ +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and The Qt Company. For licensing terms +** and conditions see https://www.qt.io/terms-conditions. For further +** information use the contact form at https://www.qt.io/contact-us. +** +** GNU Free Documentation License Usage +** Alternatively, this file may be used under the terms of the GNU Free +** Documentation License version 1.3 as published by the Free Software +** Foundation and appearing in the file included in the packaging of +** this file. Please review the following information to ensure +** the GNU Free Documentation License version 1.3 requirements +** will be met: https://www.gnu.org/licenses/fdl-1.3.html. +** $QT_END_LICENSE$ +** +****************************************************************************/ + +/*! + \example tutorials/notepad + \title Getting Started Programming with Qt Widgets + \brief A tutorial for Qt Widgets based on a notepad application + + In this topic, we teach basic Qt knowledge by implementing a simple + Notepad application using C++ and the \l{Qt Widgets} module. The + application is a small text editor which allows you to create a text + file, save it, print it, + or reopen and edit it again. You can also set the font to be used. + + \image notepad1.png "Notepad application" + + You can find the final Notepad source files in the qtdoc repository + in the tutorials/notepad directory. You can either fetch + the Qt 5 sources from Qt Project or install them as part of Qt 5. + The application is also available in the example list of Qt Creator's + Welcome mode. + + \section1 Creating the Notepad Project + + Setting up a new project in Qt Creator is aided by a wizard that + guides you step-by-step through the project creation process. The + wizard prompts you to enter the settings needed for that particular + type of project and creates the project for you. + + \image notepad2.png "Qt Creator New File or Project dialog" + + To create the Notepad project, select \b File > \b{New File or + Project} > \b Applications > \b {Qt Widgets Application} > \b Choose, + and follow the instructions of the wizard. In the + \b{Class Information} + dialog, type \b Notepad as the class name and select \b QMainWindow + as the base class. + + \image notepad3.png "Class Information Dialog" + + The \b {Qt Widgets Application} wizard creates a project that contains + a main source file and a set of files that specify a user interface + (Notepad widget): + + \list + \li notepad.pro - the project file. + \li main.cpp - the main source file for the application. + \li notepad.cpp - the source file of the notepad class of the + Notepad widget. + \li notepad.h - the header file of the notepad class for the + Notepad widget. + \li notepad.ui - the UI form for the Notepad widget. + \endlist + + The .cpp, .h, and .ui files come with the necessary boiler plate code + for you to be able to build and run the project. The .pro file is + complete. + We will take a closer look at the file contents in the following + sections. + + \b{Learn More} + + \table + \header + \li About + \li Here + \row + \li Using Qt Creator + \li \l{Qt Creator Manual}{Qt Creator} + \row + \li Creating other kind of applications with Qt Creator + \li \l{Qt Creator: Tutorials}{Qt Creator Tutorials} + \endtable + + + \section1 Main Source File + + The wizard generates the following code in the main.cpp file: + + \quotefromfile tutorials/notepad/main.cpp + \skipto "notepad.h" + \printuntil EditorApp.exec() + \printuntil } + + We will go through the code line by line. The following lines include + the header files for the Notepad widget and QApplication. All Qt classes + have a header file named after them. + + \quotefromfile tutorials/notepad/main.cpp + \skipto notepad.h + \printuntil QApplication + + The following line defines the main function that is the entry point + for all C and C++ based applications: + + \printline main + + The following line creates a QApplication object. This object manages + application-wide resources and is necessary to run any Qt program + that uses Qt Widgets. It constructs an application object with \c argc + command line arguments run in \c argv. (For GUI applications that + do not use Qt Widgets, you can use QGuiApplication instead.) + + \skipuntil { + \printuntil QApplication + + The following line creates the Notepad object. This is the object for + which the wizard created the class and the UI file. The user interface + contains visual elements that are called \c widgets in Qt. Examples + of widgets are text edits, scroll bars, labels, and radio buttons. A + widget can also be a container for other widgets; a dialog or a main + application window, for example. + + \printline Notepad + + The following line shows the Notepad widget on the screen in its own + window. Widgets can also function as containers. An example of this + is QMainWindow which often contains several types of widgets. Widgets + are not visible by default; the function \l{QWidget::}{show()} makes + the widget visible. + + \printline Editor.show + + The following line makes the QApplication enter its event loop. When + a Qt application is running, events are generated and sent to the + widgets of the application. Examples of events are mouse presses + and key strokes. + + \printline EditorApp.exec + + \b{Learn More} + + \table + \header + \li About + \li Here + \row + \li Widgets and Window Geometry + \li \l{Window and Dialog Widgets} + \row + \li Events and event handling + \li \l{The Event System} + \endtable + + \section1 Designing a UI + + The wizard generates a user interface definition in XML format: notepad.ui. + When you open the notepad.ui file in Qt Creator, it automatically + opens in the integrated Qt Designer. + + When you build the application, Qt Creator launches the Qt + \l{User Interface Compiler (uic)} that reads the .ui file and creates + a corresponding C++ header file, ui_notepad.h. + + \section2 Using Qt Designer + + The wizard creates an application that uses a QMainWindow. It has + its own layout to which you can add a menu bar, dock widgets, toolbars, + and a status bar. The center area can be occupied by any kind of widget. + The wizard places the Notepad widget there. + + To add widgets in Qt Designer: + + \list 1 + \li In the Qt Creator \b Editor mode, double-click the notepad.ui + file in the \b Projects view to launch the file in the integrated + Qt Designer. + \li Drag and drop widgets Text Edit (QTextEdit) to the form. + \li Press \b {Ctrl+A} (or \b {Cmd+A}) to select the widgets and click + \b {Lay out Vertically} (or press \b {Ctrl+L}) to apply a vertical + layout (QVBoxLayout). + \li Press \b {Ctrl+S} (or \b {Cmd+S}) to save your changes. + \endlist + + The UI now looks as follows in Qt Designer: + + \image notepad4.png + + You can view the generated XML file in the code editor: + + \quotefromfile tutorials/notepad/notepad.ui + + \printuntil QMenuBar + \dots + + The following line contains the XML declaration, which specifies the + XML version and character encoding used in the document: + + \code + <?xml version="1.0" encoding="UTF-8"?> + \endcode + + The rest of the file specifies an \c ui element that defines a + Notepad widget: + + \code + <ui version="4.0"> + \endcode + + The UI file is used together with the header and source file of the + Notepad class. We will look at the rest of the UI file in the later + sections. + + \section2 Notepad Header File + + The wizard generated a header file for the Notepad class that has the + necessary #includes, a constructor, a destructor, and the Ui object. + The file looks as follows: + + \snippet tutorials/notepad/notepad.h all + + The following line includes QMainWindow that provides a main application + window: + + \snippet tutorials/notepad/notepad.h 1 + + The following lines declare the Notepad class in the Ui namespace, + which is the standard namespace for the UI classes generated from + .ui files by the \c uic tool: + + \snippet tutorials/notepad/notepad.h 2 + + The class declaration contains the \c Q_OBJECT macro. It must come + first in the class definition, and declares our class as a QObject. + Naturally, it must also inherit from QObject. A QObject adds several + abilities to a normal C++ class. Notably, the class name and slot + names can be queried at runtime. It is also possible to query a slot's + parameter types and invoke it. + + \snippet tutorials/notepad/notepad.h 3 + + The following lines declare a constructor that has a default argument + called \c parent. + The value 0 indicates that the widget has no parent (it is a top-level + widget). + + \snippet tutorials/notepad/notepad.h 4 + + The following line declares a virtual destructor to free the resources + that were acquired by the object during its life-cycle. According to + the C++ naming convention, destructors have the same name as the class + they are associated with, prefixed with a tilde (~). In QObject, + destructors are virtual to ensure that the destructors of derived + classes are invoked properly when an object is deleted through a + pointer-to-base-class. + + \snippet tutorials/notepad/notepad.h 5 + + The following lines declare a member variable which is a pointer to + the Notepad UI class. A member variable is associated with a specific + class, and accessible for all its methods. + + \snippet tutorials/notepad/notepad.h 6 + + \section2 Notepad Source File + + The source file that the wizard generated for the Notepad class looks + as follows: + + \quotefromfile tutorials/notepad/notepad.cpp + \skipto notepad.h + \printuntil ui->textEdit->setFont(font) + \printuntil } + + The following lines include the Notepad class header file that was + generated by the wizard and the UI header file that was generated + by the \c uic tool: + + \quotefromfile tutorials/notepad/notepad.cpp + \skipto notepad.h + \printuntil ui_notepad + + The following line defines the \c {Notepad} constructor: + + \skipto Notepad::Notepad + \printline Notepad::Notepad + + The following line calls the QMainWindow constructor, which is + the base class for the Notepad class: + + \printline QMainWindow + + The following line creates the UI class instance and assigns it to + the \c ui member: + + \printline ui(new + + The following line sets up the UI: + + \quotefromfile tutorials/notepad/notepad.cpp + \skipto ui->setupUi + \printline ui->setupUi(this) + + In the destructor, we delete the \c ui: + + \skipto Notepad::~Notepad + \printuntil } + + In order to have the text edit field occupy the whole screen, we add + \c setCentralWidget to the main window. + + \quotefromfile tutorials/notepad/notepad.cpp + \skipto Notepad::Notepad(QWidget *parent) + \printuntil } + + \section2 Project File + + The wizard generates the following project file, \c {notepad.pro}, for + us: + + \quotefile tutorials/notepad/notepad.pro + + The project file specifies the application name and the \c qmake + template to use for generating the project, as well as the source, + header, and UI files included in the project. + + You could also use \c qmake's \c -project option to generate the \.pro + file. Although, in that case, you have to remember to add the line + \c{QT += widgets} to the generated file in order to link against the + Qt Widgets Module. + + \b{Learn More} + + \table + \header + \li About + \li Here + \row + \li Using Qt Designer + \li \l{Qt Designer Manual} + \row + \li Layouts + \li \l{Layout Management}, + \l{Widgets and Layouts}, + \l{Layout Examples} + \row + \li The widgets that come with Qt + \li \l{Qt Widget Gallery} + \row + \li Main windows and main window classes + \li \l{Application Main Window}, + \l{Main Window Examples} + \row + \li QObjects and the Qt Object model (This is essential to + understand Qt) + \li \l{Object Model} + \row + \li qmake and the Qt build system + \li \l{qmake Manual} + \endtable + + \section1 Adding User Interaction + + + To add functionality to the editor, we start by adding menu items + and buttons on a toolbar. + + Click on "Type Here", and add the options New, Open, Save, Save as, + Print and Exit. This creates 5 lines in the Action Editor below. + To connect the actions to slots, right-click an action and select + Go to slot > triggered(), and complete the code for that given slot. + + If we also want to add the actions to a toolbar, we can assign an + icon to each QAction, and then drag the QAction to the toolbar. You + assign an icon by entering an icon name in the Icon property of the + action concerned. When the QAction has been dragged to the toolbar, + clicking the icon will launch the associated slot. + + Complete the method \c on_actionNew_triggered(): + + \quotefromfile tutorials/notepad/notepad.cpp + \skipto on_actionNew_triggered() + \printuntil } + + \c current_file is a global variable containing the file presently + being edited. + It is defined in the private part of notepad.h: + + \quotefromfile tutorials/notepad/notepad.h + \skipto private: + \printuntil currentFile; + + \c clear() clears the text buffer. + + \section2 Opening a file + + In \c notepad.ui, right click on \c actionOpen and select \c {Go to + slot} + + Complete method \c on_actionOpen_triggered(). + + \quotefromfile tutorials/notepad/notepad.cpp + \skipto on_actionOpen_triggered() + \printuntil file.close + \printuntil } + + + \c QFileDialog::getOpenFileName opens a dialog enabling you to select + a file. QFile object \c myfile has the selected \c file_name as + parameter. We store the selected file also into the global variable + \c current_file for later purposes. We open the file with \c file.open + as a readonly text file. If it cannot be opened, a warning is issued, + and the program stops. + + We define a QTextStream \c instream for parameter \c myfile. + The contents of file \c myfile is copied into QString \a text. + \c setText(text) fille the buffer of our editor with \c text. + + \c section2 Saving a file + + We create the method for saving a file in the same way as for + \l {Opening a file}, by right clicking on \c actionSave, and + selecting \c {Go to Slot}. + + \skipto Notepad::on_actionSave_triggered + \printuntil file.close + \printuntil } + + QFile object \c myfile is linked to global variable \c current_file, + the variable that contains the file we were working with. + If we cannot open \c myfile, an error message is issued and the + method stops. We create a QTextStream \c outstream. The contents + of the editor buffer is converted to plain text, and then written + to \c outstream. + + \section2 Saving a file with \c {Save as} + + \skipto Notepad::on_actionSave_as_triggered + \printuntil file.close + \printuntil } + + This is the same procedure as for \c {Saving a file}, the only + difference being that here you need to enter a new file name for + the file to be created. + + + \section2 Print a File + + If you want to use print functionalities, you need to add + \c printsupport to the project file: + + \badcode + QT += printsupport + \endcode + + We declare a QPrinter object called \c printer. + We launch a printer dialog box and store the selected printer in + object \c printer. If we clicked on \c Cancel and did not select + a printer, the methods returns. The actual printer command is given + with \a ui->textEdit->print with our QPrinter object as parameter. + + \section2 Select a Font + + \skipto Notepad::on_actionFont_triggered + \printuntil ui->textEdit->setFont + \printline } + + We declare a boolean indicating if we did select a font with + QFontDialog. If so, we set the font with \c ui->textEdit->setFont(myfont). + + \section2 Copy, Cut, Paste, Undo, and Redo + + If you select some text, and want to copy it to the clipboard, + you call the appropriate method of ui->textEdit. The same counts + for cut, paste, undo, and redo. + + This table shows the method name to use. + + \table + \header + \li Task + \li Method called + \row + \li Copy + \li ui->textEdit->copy() + \row + \li Cut + \li ui->textEdit->cut() + \row + \li Paste + \li ui->textEdit->paste() + \row + \li Undo + \li ui->textEdit->undo() + \row + \li Redo + \li ui->textEdit->redo() + \endtable + + \b{Learn More} + + \table + \header + \li About + \li Here + \row + \li MDI applications + \li QMdiArea, + \l{MDI Example} + \row + \li Files and I/O devices + \li QFile, QIODevice + \row + \li tr() and internationalization + \li \l{Qt Linguist Manual}, + \l{Writing Source Code for Translation}, + \l{Internationalization with Qt} + \endtable + + \section1 Building and Running Notepad + + Now that you have all the necessary files, select \b Build > + \b {Build Project Notepad} to build and run the application. Qt + Creator uses \c qmake and \c make to create an executable in the + directory specified in the build settings of the project and runs + it. + + \section2 Building and Running from the Command Line + + To build the application from the command line, switch to the + directory in which you have the \c .cpp file of the application + and add the project file (suffixed .pro) described earlier. The + following shell commands then build the application: + + \badcode + qmake + make (or nmake on Windows) + \endcode + + The commands create an executable in the project directory. The + \c qmake tool reads the project file and produces a \c Makefile + with instructions on how to build the application. + The \c make tool (or the \c nmake tool) then reads the \c Makefile + and produces the executable binary. +*/ diff --git a/examples/widgets/tutorials/notepad/images/copy.png b/examples/widgets/tutorials/notepad/images/copy.png Binary files differnew file mode 100644 index 0000000000..cb3442c04c --- /dev/null +++ b/examples/widgets/tutorials/notepad/images/copy.png diff --git a/examples/widgets/tutorials/notepad/images/create.png b/examples/widgets/tutorials/notepad/images/create.png Binary files differnew file mode 100644 index 0000000000..fdfd4b438a --- /dev/null +++ b/examples/widgets/tutorials/notepad/images/create.png diff --git a/examples/widgets/tutorials/notepad/images/cut.png b/examples/widgets/tutorials/notepad/images/cut.png Binary files differnew file mode 100644 index 0000000000..74b15301ff --- /dev/null +++ b/examples/widgets/tutorials/notepad/images/cut.png diff --git a/examples/widgets/tutorials/notepad/images/edit_redo.png b/examples/widgets/tutorials/notepad/images/edit_redo.png Binary files differnew file mode 100644 index 0000000000..8a7725463c --- /dev/null +++ b/examples/widgets/tutorials/notepad/images/edit_redo.png diff --git a/examples/widgets/tutorials/notepad/images/edit_undo.png b/examples/widgets/tutorials/notepad/images/edit_undo.png Binary files differnew file mode 100644 index 0000000000..852f5e3b29 --- /dev/null +++ b/examples/widgets/tutorials/notepad/images/edit_undo.png diff --git a/examples/widgets/tutorials/notepad/images/exit.png b/examples/widgets/tutorials/notepad/images/exit.png Binary files differnew file mode 100644 index 0000000000..677d4deef2 --- /dev/null +++ b/examples/widgets/tutorials/notepad/images/exit.png diff --git a/examples/widgets/tutorials/notepad/images/font.png b/examples/widgets/tutorials/notepad/images/font.png Binary files differnew file mode 100644 index 0000000000..925e501c03 --- /dev/null +++ b/examples/widgets/tutorials/notepad/images/font.png diff --git a/examples/widgets/tutorials/notepad/images/info.png b/examples/widgets/tutorials/notepad/images/info.png Binary files differnew file mode 100644 index 0000000000..9731212c4f --- /dev/null +++ b/examples/widgets/tutorials/notepad/images/info.png diff --git a/examples/widgets/tutorials/notepad/images/new.png b/examples/widgets/tutorials/notepad/images/new.png Binary files differnew file mode 100644 index 0000000000..b24edc5d0c --- /dev/null +++ b/examples/widgets/tutorials/notepad/images/new.png diff --git a/examples/widgets/tutorials/notepad/images/open.png b/examples/widgets/tutorials/notepad/images/open.png Binary files differnew file mode 100644 index 0000000000..7b052edf5a --- /dev/null +++ b/examples/widgets/tutorials/notepad/images/open.png diff --git a/examples/widgets/tutorials/notepad/images/paste.png b/examples/widgets/tutorials/notepad/images/paste.png Binary files differnew file mode 100644 index 0000000000..c50dbd95b2 --- /dev/null +++ b/examples/widgets/tutorials/notepad/images/paste.png diff --git a/examples/widgets/tutorials/notepad/images/pencil.png b/examples/widgets/tutorials/notepad/images/pencil.png Binary files differnew file mode 100644 index 0000000000..a9c5e5482a --- /dev/null +++ b/examples/widgets/tutorials/notepad/images/pencil.png diff --git a/examples/widgets/tutorials/notepad/images/print.png b/examples/widgets/tutorials/notepad/images/print.png Binary files differnew file mode 100644 index 0000000000..0cd3f28bd8 --- /dev/null +++ b/examples/widgets/tutorials/notepad/images/print.png diff --git a/examples/widgets/tutorials/notepad/images/save.png b/examples/widgets/tutorials/notepad/images/save.png Binary files differnew file mode 100644 index 0000000000..e65a29d5f1 --- /dev/null +++ b/examples/widgets/tutorials/notepad/images/save.png diff --git a/examples/widgets/tutorials/notepad/images/save_as.png b/examples/widgets/tutorials/notepad/images/save_as.png Binary files differnew file mode 100644 index 0000000000..6040574322 --- /dev/null +++ b/examples/widgets/tutorials/notepad/images/save_as.png diff --git a/examples/widgets/tutorials/notepad/main.cpp b/examples/widgets/tutorials/notepad/main.cpp new file mode 100644 index 0000000000..20bcdaa7df --- /dev/null +++ b/examples/widgets/tutorials/notepad/main.cpp @@ -0,0 +1,61 @@ +/**************************************************************************** +** +** Copyright (C) 2017 The Qt Company Ltd. +** Contact: https://www.qt.io/licensing/ +** +** This file is part of the documentation of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:BSD$ +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and The Qt Company. For licensing terms +** and conditions see https://www.qt.io/terms-conditions. For further +** information use the contact form at https://www.qt.io/contact-us. +** +** BSD License Usage +** Alternatively, you may use this file under the terms of the BSD license +** as follows: +** +** "Redistribution and use in source and binary forms, with or without +** modification, are permitted provided that the following conditions are +** met: +** * Redistributions of source code must retain the above copyright +** notice, this list of conditions and the following disclaimer. +** * Redistributions in binary form must reproduce the above copyright +** notice, this list of conditions and the following disclaimer in +** the documentation and/or other materials provided with the +** distribution. +** * Neither the name of The Qt Company Ltd nor the names of its +** contributors may be used to endorse or promote products derived +** from this software without specific prior written permission. +** +** +** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE." +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#include "notepad.h" +#include <QApplication> + +int main(int argc, char *argv[]) +{ + QApplication EditorApp(argc, argv); + Notepad Editor; + Editor.show(); + + return EditorApp.exec(); +} diff --git a/examples/widgets/tutorials/notepad/notepad.cpp b/examples/widgets/tutorials/notepad/notepad.cpp new file mode 100644 index 0000000000..b4f6cf7f8f --- /dev/null +++ b/examples/widgets/tutorials/notepad/notepad.cpp @@ -0,0 +1,182 @@ +/**************************************************************************** +** +** Copyright (C) 2017 The Qt Company Ltd. +** Contact: https://www.qt.io/licensing/ +** +** This file is part of the documentation of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:BSD$ +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and The Qt Company. For licensing terms +** and conditions see https://www.qt.io/terms-conditions. For further +** information use the contact form at https://www.qt.io/contact-us. +** +** BSD License Usage +** Alternatively, you may use this file under the terms of the BSD license +** as follows: +** +** "Redistribution and use in source and binary forms, with or without +** modification, are permitted provided that the following conditions are +** met: +** * Redistributions of source code must retain the above copyright +** notice, this list of conditions and the following disclaimer. +** * Redistributions in binary form must reproduce the above copyright +** notice, this list of conditions and the following disclaimer in +** the documentation and/or other materials provided with the +** distribution. +** * Neither the name of The Qt Company Ltd nor the names of its +** contributors may be used to endorse or promote products derived +** from this software without specific prior written permission. +** +** +** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE." +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#include <QFile> +#include <QFileDialog> +#include <QTextStream> +#include <QMessageBox> +#include <QPrintDialog> +#include <QPrinter> +#include <QFont> +#include <QFontDialog> + +#include "notepad.h" +#include "ui_notepad.h" + +Notepad::Notepad(QWidget *parent) : + QMainWindow(parent), + ui(new Ui::Notepad) +{ + ui->setupUi(this); + this->setCentralWidget(ui->textEdit); +} + +Notepad::~Notepad() +{ + delete ui; +} + +void Notepad::on_actionNew_triggered() +{ + currentFile.clear(); + ui->textEdit->setText(QString()); +} + +void Notepad::on_actionOpen_triggered() +{ + QString fileName = QFileDialog::getOpenFileName(this, "Open the file"); + QFile file(fileName); + currentFile = fileName; + if (!file.open(QIODevice::ReadOnly | QFile::Text)) { + QMessageBox::warning(this, "Warning", "Cannot open file: " + file.errorString()); + return; + } + setWindowTitle(fileName); + QTextStream in(&file); + QString text = in.readAll(); + ui->textEdit->setText(text); + file.close(); +} + +void Notepad::on_actionSave_triggered() +{ + QString fileName; + // If we don't have a filename from before, get one. + if (currentFile.isEmpty()) { + fileName = QFileDialog::getSaveFileName(this, "Save"); + currentFile = fileName; + } else { + fileName = currentFile; + } + QFile file(fileName); + if (!file.open(QIODevice::WriteOnly | QFile::Text)) { + QMessageBox::warning(this, "Warning", "Cannot save file: " + file.errorString()); + return; + } + setWindowTitle(fileName); + QTextStream out(&file); + QString text = ui->textEdit->toPlainText(); + out << text; + file.close(); +} + +void Notepad::on_actionSave_as_triggered() +{ + QString fileName = QFileDialog::getSaveFileName(this, "Save as"); + QFile file(fileName); + + if (!file.open(QFile::WriteOnly | QFile::Text)) { + QMessageBox::warning(this, "Warning", "Cannot save file: " + file.errorString()); + return; + } + currentFile = fileName; + setWindowTitle(fileName); + QTextStream out(&file); + QString text = ui->textEdit->toPlainText(); + out << text; + file.close(); +} + +void Notepad::on_actionPrint_triggered() +{ + QPrinter printDev; + QPrintDialog dialog(&printDev, this); + if (dialog.exec() == QDialog::Rejected) + return; + ui->textEdit->print(&printDev); +} + +void Notepad::on_actionExit_triggered() +{ + QCoreApplication::quit(); +} + +void Notepad::on_actionCopy_triggered() +{ + ui->textEdit->copy(); +} + +void Notepad::on_actionCut_triggered() +{ + ui->textEdit->cut(); +} + +void Notepad::on_actionPaste_triggered() +{ + ui->textEdit->paste(); +} + +void Notepad::on_actionUndo_triggered() +{ + ui->textEdit->undo(); +} + +void Notepad::on_actionRedo_triggered() +{ + ui->textEdit->redo(); +} + +void Notepad::on_actionFont_triggered() +{ + bool fontSelected; + QFont font = QFontDialog::getFont(&fontSelected, this); + if (fontSelected) + ui->textEdit->setFont(font); +} diff --git a/examples/widgets/tutorials/notepad/notepad.h b/examples/widgets/tutorials/notepad/notepad.h new file mode 100644 index 0000000000..f688df45ac --- /dev/null +++ b/examples/widgets/tutorials/notepad/notepad.h @@ -0,0 +1,114 @@ +/**************************************************************************** +** +** Copyright (C) 2017 The Qt Company Ltd. +** Contact: https://www.qt.io/licensing/ +** +** This file is part of the documentation of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:BSD$ +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and The Qt Company. For licensing terms +** and conditions see https://www.qt.io/terms-conditions. For further +** information use the contact form at https://www.qt.io/contact-us. +** +** BSD License Usage +** Alternatively, you may use this file under the terms of the BSD license +** as follows: +** +** "Redistribution and use in source and binary forms, with or without +** modification, are permitted provided that the following conditions are +** met: +** * Redistributions of source code must retain the above copyright +** notice, this list of conditions and the following disclaimer. +** * Redistributions in binary form must reproduce the above copyright +** notice, this list of conditions and the following disclaimer in +** the documentation and/or other materials provided with the +** distribution. +** * Neither the name of The Qt Company Ltd nor the names of its +** contributors may be used to endorse or promote products derived +** from this software without specific prior written permission. +** +** +** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE." +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#ifndef NOTEPAD_H +#define NOTEPAD_H + +//! [all] +//! [1] +#include <QMainWindow> +//! [1] + +//! [2] +QT_BEGIN_NAMESPACE +namespace Ui { +class Notepad; +} +QT_END_NAMESPACE +//! [2] + +//! [3] +class Notepad : public QMainWindow +{ + Q_OBJECT +//! [3] + +//! [4] +public: + explicit Notepad(QWidget *parent = 0); +//! [4] +//! [5] + ~Notepad(); +//! [5] + +private slots: + void on_actionNew_triggered(); + + void on_actionOpen_triggered(); + + void on_actionSave_triggered(); + + void on_actionSave_as_triggered(); + + void on_actionPrint_triggered(); + + void on_actionExit_triggered(); + + void on_actionCopy_triggered(); + + void on_actionCut_triggered(); + + void on_actionPaste_triggered(); + + void on_actionUndo_triggered(); + + void on_actionRedo_triggered(); + + void on_actionFont_triggered(); + +//! [6] +private: + Ui::Notepad *ui; + QString currentFile; +//! [6] +}; +//! [all] + +#endif // NOTEPAD_H diff --git a/examples/widgets/tutorials/notepad/notepad.pro b/examples/widgets/tutorials/notepad/notepad.pro new file mode 100644 index 0000000000..7369dbc991 --- /dev/null +++ b/examples/widgets/tutorials/notepad/notepad.pro @@ -0,0 +1,20 @@ +TEMPLATE = app +TARGET = notepad + +QT += printsupport + +SOURCES += \ + main.cpp\ + notepad.cpp + +HEADERS += notepad.h + +FORMS += notepad.ui + +RESOURCES += \ + notepad.qrc + +# install +target.path = $$[QT_INSTALL_EXAMPLES]/widgets/tutorials/notepad +INSTALLS += target + diff --git a/examples/widgets/tutorials/notepad/notepad.qrc b/examples/widgets/tutorials/notepad/notepad.qrc new file mode 100644 index 0000000000..ec11679f13 --- /dev/null +++ b/examples/widgets/tutorials/notepad/notepad.qrc @@ -0,0 +1,19 @@ +<RCC> + <qresource prefix="/"> + <file>images/copy.png</file> + <file>images/create.png</file> + <file>images/cut.png</file> + <file>images/edit_redo.png</file> + <file>images/edit_undo.png</file> + <file>images/exit.png</file> + <file>images/font.png</file> + <file>images/info.png</file> + <file>images/new.png</file> + <file>images/open.png</file> + <file>images/paste.png</file> + <file>images/pencil.png</file> + <file>images/print.png</file> + <file>images/save.png</file> + <file>images/save_as.png</file> + </qresource> +</RCC> diff --git a/examples/widgets/tutorials/notepad/notepad.ui b/examples/widgets/tutorials/notepad/notepad.ui new file mode 100644 index 0000000000..d197a95fe7 --- /dev/null +++ b/examples/widgets/tutorials/notepad/notepad.ui @@ -0,0 +1,196 @@ +<?xml version="1.0" encoding="UTF-8"?> +<ui version="4.0"> + <class>Notepad</class> + <widget class="QMainWindow" name="Notepad"> + <property name="geometry"> + <rect> + <x>0</x> + <y>0</y> + <width>524</width> + <height>300</height> + </rect> + </property> + <property name="windowTitle"> + <string>Notepad</string> + </property> + <widget class="QWidget" name="centralWidget"> + <layout class="QVBoxLayout" name="verticalLayout"> + <item> + <widget class="QTextEdit" name="textEdit"/> + </item> + </layout> + </widget> + <widget class="QMenuBar" name="menuBar"> + <property name="geometry"> + <rect> + <x>0</x> + <y>0</y> + <width>524</width> + <height>25</height> + </rect> + </property> + <widget class="QMenu" name="menuFile"> + <property name="title"> + <string>File</string> + </property> + <addaction name="actionNew"/> + <addaction name="actionOpen"/> + <addaction name="actionSave"/> + <addaction name="actionSave_as"/> + <addaction name="actionPrint"/> + <addaction name="separator"/> + <addaction name="actionExit"/> + </widget> + <widget class="QMenu" name="menuEdit"> + <property name="title"> + <string>Edit</string> + </property> + <addaction name="actionCopy"/> + <addaction name="actionCut"/> + <addaction name="actionPaste"/> + <addaction name="separator"/> + <addaction name="actionUndo"/> + <addaction name="actionRedo"/> + <addaction name="actionFont"/> + </widget> + <addaction name="menuFile"/> + <addaction name="menuEdit"/> + </widget> + <widget class="QToolBar" name="mainToolBar"> + <attribute name="toolBarArea"> + <enum>TopToolBarArea</enum> + </attribute> + <attribute name="toolBarBreak"> + <bool>false</bool> + </attribute> + <addaction name="actionNew"/> + <addaction name="actionOpen"/> + <addaction name="actionSave"/> + <addaction name="actionSave_as"/> + <addaction name="actionPrint"/> + <addaction name="separator"/> + <addaction name="actionCopy"/> + <addaction name="actionCut"/> + <addaction name="actionPaste"/> + <addaction name="actionUndo"/> + <addaction name="actionRedo"/> + <addaction name="actionFont"/> + <addaction name="separator"/> + <addaction name="actionExit"/> + </widget> + <widget class="QStatusBar" name="statusBar"/> + <action name="actionNew"> + <property name="icon"> + <iconset resource="notepad.qrc"> + <normaloff>:/images/new.png</normaloff>:/images/new.png</iconset> + </property> + <property name="text"> + <string>New</string> + </property> + </action> + <action name="actionOpen"> + <property name="icon"> + <iconset> + <normaloff>:/images/open.png</normaloff>:/images/open.png</iconset> + </property> + <property name="text"> + <string>Open</string> + </property> + </action> + <action name="actionSave"> + <property name="icon"> + <iconset> + <normaloff>:/images/save.png</normaloff>:/images/save.png</iconset> + </property> + <property name="text"> + <string>Save</string> + </property> + </action> + <action name="actionSave_as"> + <property name="icon"> + <iconset> + <normaloff>:/images/save_as.png</normaloff>:/images/save_as.png</iconset> + </property> + <property name="text"> + <string>Save as</string> + </property> + </action> + <action name="actionPrint"> + <property name="icon"> + <iconset> + <normaloff>:/images/print.png</normaloff>:/images/print.png</iconset> + </property> + <property name="text"> + <string>Print</string> + </property> + </action> + <action name="actionExit"> + <property name="icon"> + <iconset> + <normaloff>:/images/exit.png</normaloff>:/images/exit.png</iconset> + </property> + <property name="text"> + <string>Exit</string> + </property> + </action> + <action name="actionCopy"> + <property name="icon"> + <iconset> + <normaloff>:/images/copy.png</normaloff>:/images/copy.png</iconset> + </property> + <property name="text"> + <string>Copy</string> + </property> + </action> + <action name="actionCut"> + <property name="icon"> + <iconset> + <normaloff>:/images/cut.png</normaloff>:/images/cut.png</iconset> + </property> + <property name="text"> + <string>Cut</string> + </property> + </action> + <action name="actionPaste"> + <property name="icon"> + <iconset> + <normaloff>:/images/paste.png</normaloff>:/images/paste.png</iconset> + </property> + <property name="text"> + <string>Paste</string> + </property> + </action> + <action name="actionUndo"> + <property name="icon"> + <iconset> + <normaloff>:/images/edit_undo.png</normaloff>:/images/edit_undo.png</iconset> + </property> + <property name="text"> + <string>Undo</string> + </property> + </action> + <action name="actionRedo"> + <property name="icon"> + <iconset> + <normaloff>:/images/edit_redo.png</normaloff>:/images/edit_redo.png</iconset> + </property> + <property name="text"> + <string>Redo</string> + </property> + </action> + <action name="actionFont"> + <property name="icon"> + <iconset> + <normaloff>:/images/font.png</normaloff>:/images/font.png</iconset> + </property> + <property name="text"> + <string>Font</string> + </property> + </action> + </widget> + <layoutdefault spacing="6" margin="11"/> + <resources> + <include location="notepad.qrc"/> + </resources> + <connections/> +</ui> diff --git a/examples/widgets/tutorials/tutorials.pro b/examples/widgets/tutorials/tutorials.pro index 2eb87cdbd5..0aaa119d8f 100644 --- a/examples/widgets/tutorials/tutorials.pro +++ b/examples/widgets/tutorials/tutorials.pro @@ -1,2 +1,2 @@ TEMPLATE = subdirs -SUBDIRS += addressbook widgets modelview gettingStarted +SUBDIRS += addressbook widgets modelview gettingStarted notepad |