БлогNot. QT: самый простой в мире "Блокнот"

QT: самый простой в мире "Блокнот"

В тему вот этой статьи, только проще, для "совсем начинающих", проекты рассчитаны на QT 5.2 и выше.

Действительно, короче, чем на QT, примитивный "Блокнот" вряд ли на чём-то возможно написать. Достаточно указать тип приложения и исходник в файле-описании проекта с расширением .pro:

QT       += gui widgets
TARGET = Notepad0
SOURCES += main.cpp

и из main.cpp передать управление виджету-редактору типа QTextEdit (ниже - весь файл main.cpp, соответственно, весь проект):

#include <QApplication>
#include <QTextEdit>

int main(int argv, char **args) {
 QApplication app(argv, args);
 QTextEdit textEdit;
 textEdit.show();
 return app.exec();
}

 Скачать папку проекта QT5 QTNotepad0 в архиве .zip (1 Кб)

Правда, ни открыть, ни сохранить файл такой мини-редактор не сможет. Добавим эти возможности, для чего создадим проект QTNotepad на основе виджета QMainWindow.

В QT Creator выберем меню Файл, пункт Новый файл или проект..., укажем шаблон "Приложения" и "Приложение QT Widgets", введём имя проекта QTNotepad, на втором шаге мастера обычно просто жмут "Далее", на третьем шаге убедимся, что базовый класс приложения - именно QMainWindow (см.рис.), на последнем шаге тоже можно оставить всё как есть.

выбор базового класса для виджета QT
выбор базового класса для виджета QT

Объекты mainToolBar (кнопки под меню), statusBar (нижняя строка статуса приложения), которые мы не используем, можно просто удалить в режиме "Дизайн" из окна Инспектора объектов (откройте двойным щелчком форму mainwindow.ui из окна "Проекты", кнопка "Дизайн" станет доступна).

Удаление "лишних" элементов из окна QMainWindow
Удаление "лишних" элементов из окна QMainWindow

Ниже показаны все файлы приложения, уже умеющего открывать и сохранять текстовый файл :) Строки, добавленные нами к автосгенерированному коду, снабжены комментариями //.

Файл mainwindow.h
#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>
#include <QtWidgets>

namespace Ui { class MainWindow; }

class MainWindow : public QMainWindow {
 Q_OBJECT

public:
 explicit MainWindow(QApplication *parent = 0);
 ~MainWindow();
private slots:
 void open(); //метод для открытия файла
 void save(); //метод для сохранения файла
private:
 Ui::MainWindow *ui;
 QTextEdit *textEdit; //указатель на поле ввода текста
 QAction *openAction; //указатели на действия "Открыть",
 QAction *saveAction; //"Сохранить"
 QAction *exitAction; //и "Выйти"
 QMenu *fileMenu; //Указатель на меню
};

#endif // MAINWINDOW_H
Файл mainwindow.cpp
#include "mainwindow.h"
#include "ui_mainwindow.h"

MainWindow::MainWindow(QApplication *parent) :
    QMainWindow(),ui(new Ui::MainWindow) {
 ui->setupUi(this);
 //После этой строчки - наши действия!
 openAction = new QAction(tr("&Открыть"), this);
 connect(openAction, SIGNAL(triggered()), this, SLOT(open()));
 saveAction = new QAction(tr("&Сохранить"), this);
 connect(saveAction, SIGNAL(triggered()), this, SLOT(save()));
 exitAction = new QAction(tr("&Выход"), this);
 connect(exitAction, SIGNAL(triggered()), this, SLOT(close()));
 fileMenu = this->menuBar()->addMenu(tr("&Файл"));
 fileMenu->addAction(openAction);
 fileMenu->addAction(saveAction);
 fileMenu->addSeparator();
 fileMenu->addAction(exitAction);
 textEdit = new QTextEdit();
 setCentralWidget(textEdit);
 setWindowTitle(tr("Блокнотик"));
}

MainWindow::~MainWindow() { delete ui; }

//Ниже - наши методы класса
void MainWindow::open() {
 QString fileName = QFileDialog::getOpenFileName(this,
  tr("Открыть файл"), "",
  tr("Текстовые файлы (*.txt);;Файлы C++ (*.cpp *.h)"));
 if (fileName != "") {
  QFile file(fileName);
  if (!file.open(QIODevice::ReadOnly)) {
   QMessageBox::critical(this, tr("Ошибка"), tr("Не могу открыть файл"));
   return;
  }
  QTextStream in(&file);
  textEdit->setText(in.readAll());
  file.close();
 }
}

void MainWindow::save() {
 QString fileName = QFileDialog::getSaveFileName(this,
  tr("Сохранить файл"), "",
  tr("Текстовые файлы (*.txt);;Файлы C++ (*.cpp *.h)"));
 if (fileName != "") {
  QFile file(fileName);
  if (!file.open(QIODevice::WriteOnly)) {
   QMessageBox msgBox; msgBox.setText("Не могу записать файл"); msgBox.exec();
   //или как выше, коротко QMessageBox::critical...
  }
  else {
   QTextStream stream(&file);
   stream << textEdit->toPlainText();
   stream.flush();
   file.close();
  }
 }
}
Файл main.cpp
#include <QApplication>
#include "mainwindow.h"

int main(int argc, char *argv[]) {
 QApplication a(argc, argv);
 a.setQuitOnLastWindowClosed(true);
  //При закрытии последнего окна освободить ресурсы приложения
  //и закрыть его
 MainWindow w; //Создаём,
 w.show(); //показываем виджет
 return a.exec(); //и запускаем цикл обработки событий приложения
}

 Скачать папку проекта QT5 QTNotepad в архиве .zip (3 Кб)

03.02.2017, 22:11 [9713 просмотров]


теги: учебное c++ qt

К этой статье пока нет комментариев, Ваш будет первым