Подсказки на компьютерную тематику

Можно подсмотреть, если забыли…

Как создать простое приложение на C++ с графическим интерфейсом в Qt на Ubuntu

Основные действия для создания программы на C++ в Qt

Набор файлов, необходимых для создания программы в Qt

    При создании программы на C++ в Qt обычно используются файлы:

  • main.cpp – содержит функцию main() с кодом для запуска приложения, и является главным файлом каждого проекта, его обычно можно не редактировать
  • mainwindow.ui – файл графического редактора для добавления элементов в форму окна создаваемого приложения, в нем добавляются виджеты для программы
  • mainwindow.h – заголовочный файл с классами, создаваемыми по умолчанию, также в этом файле регистрируются функции, называемые Слотами, которые подключают самодельный код к программе
  • mainwindow.cpp – файл, в который добавляется почти весь код для работы приложения, основная работа идет с ним

Действия для запуска созданной программы на C++ в Qt

    После создания кода следует нажать в левом окне приложения Qt:

  • Build – для сборки проекта
  • Debug – для выбора компилятора и запуска компиляции программы
  • Run – для запуска приложения из среды Qt

Минимальный набор файлов для создания простого приложения на C++ в Qt, на примере создания программы-калькулятора

Файл main.cpp

Этот код можно оставить, как есть:
#include "mainwindow.h"
#include <QApplication>//подключает класс для работы с QApplication, добавляется обязательно !!!

int main(int argc, char *argv[])
{
QApplication a(argc, argv); //создает экземпляр класса QApplication, обычно он один, должно быть обязательно в коде main()!!!
MainWindow w; //создает окно 'w', оно обычно только одно, должно быть обязательно в коде main()!!!

w.show();//показывает окно приложения 'w' , должно быть обязательно в коде main()!!!
return a.exec();//запускает приложение, должно быть обязательно в коде main()!!!
}

Файл mainwindow.ui

При его выборе появляется графический дизайнер, в котором путем перетаскивания можно добавить в приложение все требуемые виджеты.
При выборе одного элемента QLineEdit (для ввода и вывода данных) и пяти элементов QPushButton, они появятся в окне и по умолчанию будут иметь имена объектов ObjectNamelineEdit, pushButton, pushButton_2, pushButton_3, pushButton_4 и pushButton_5, по которым и нужно будет обращаться к каждому из этих элементов.

Файл mainwindow.h

В этом файле нужно инициировать методы класса MainWindow, для получения ответа программы на какие-либо действия пользователя. Например, нажать кнопку и получить результат, в зависимости от функции, прикрепленной к этой кнопке.
Эти методы инициируются их простым добавлением в раздел private slots: класса class MainWindow : public QMainWindow.
Пример файла:
#ifndef MAINWINDOW_H
#define MAINWINDOW_H
#include <QMainWindow>

namespace Ui {
class MainWindow;
}
class MainWindow : public QMainWindow
{
Q_OBJECT

public:
explicit MainWindow(QWidget *parent = nullptr);
~MainWindow();

private slots:
void addSlot(); // это созданный нами слот для операции +
void subtractSlot(); // это созданный нами слот для операции -
void multiplySlot(); // это созданный нами слот для операции *
void divideSlot(); // это созданный нами слот для операции /
void equallySlot(); // это созданный нами слот для операции =

private:
Ui::MainWindow *ui;
};

#endif // MAINWINDOW_H

И больше в этом файле можно ничего не добавлять.

Файл mainwindow.cpp

Этот файл является основным в приложении.

    Вид кода, который в него помещается:

  • по умолчанию – подключаются заголовочные файлы и классы
    #include "mainwindow.h"
    #include "ui_mainwindow.h"
    #include <QApplication>//подключает класс для работы с QApplication, добавляется обязательно !!!
  • при необходимости – классы для работы с виджетами
    //#include <QAbstractButton>//
    //#include <QWidget> //
    //#include <QPushButton> //подключает класс для работы с кнопками, добавляется при необходимости!
    //#include <QProgressBar> //подключает класс для работы с QProgressBar, добавляется при необходимости!
    //#include <QSlider> //подключает класс для работы с QSlider, добавляется при необходимости!
    //#include <QLineEdit> //подключает класс для работы с полем для ввода текста, добавляется при необходимости!
    //#include <QLabel> //подключает класс для работы с полем для показа какой-либо информации, добавляется при необходимости!
    //#include <QValidator> //подключает класс для фильтра значений, добавляется при необходимости!
    //#include <QDoubleValidator> //подключает класс для фильтра числовых значений типа double, добавляется при необходимости!
    #include <QRegExpValidator> //подключает класс для фильтра значений через регулярные выражения, добавляется при необходимости!
    //#include <QtMath> //подключает класс для математических функций
  • в функцию MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
    , после строки ui->setupUi(this); обычно прописывается связь или связи между объектом, в котором или с которым производятся действия и объектом, который будет выводить результат обработки этих действий.
    Эта связь называется connect(), например:
    ui->setupUi(this);
    connect(ui->pushButton, SIGNAL(clicked()), this, SLOT(addSlot())); //для сложения
    connect(ui->pushButton_2, SIGNAL(clicked()), this, SLOT(subtractSlot())); //для вычитания
    connect(ui->pushButton_3, SIGNAL(clicked()), this, SLOT(multiplySlot())); //для умножения
    connect(ui->pushButton_4, SIGNAL(clicked()), this, SLOT(divideSlot())); //для деления
    connect(ui->pushButton_5, SIGNAL(clicked()), this, SLOT(equallySlot())); //для получения результата
  • В функции connect()должно быть четыре элемента, например:
    ui->pushButton показывает на какой объект надо подействовать, в данном случае это кнопка pushButton
    тип действия, здесь этот сигнал пишется так SIGNAL(clicked()) и обозначает клик по кнопке
    окно, в котором появится ответ, (так как в программе может быть несколько окон), в простейшем приложении окно только одно
    в конце указывается, какая функция должна сработать при клике на кнопку pushButton, например SLOT(addSlot())
  • класс MainWindow::~MainWindow() трогать не надо, он указан по умолчанию
  • после этого можно указать переменные, например:
    static float firstvalue;//первое введенное значение, пишется static, так как получает значение внутри другой функции
    static QString sign;//знак арифметического действия, пишется static, так как получает значение внутри другой функции
  • далее идет определение всех слотов, инициализированных в файле mainwindow.h, например:
    void MainWindow::addSlot()
    {
    ui->lineEdit->setFocus();//сделать поле ввода активным
    ::firstvalue= ui->lineEdit->text().toFloat(); // получаем первое значение QLineEdit
    ::sign = ui->pushButton->text(); // получаем строку из кнопки pushButton +
    ui->lineEdit->setFocus();//сделать поле ввода активным
    ui->lineEdit->setText(nullptr);//удалить данные из поля ввода
    }

    Если таких методов несколько, то они идут по порядку – одна за другой.
  • Если надо добавить в код какие-либо действия, которые должны выполниться при запуске программы их нужно также дописать в том же разделе, что и connect(), то есть после строки ui->setupUi(this);, например, чтобы в поле ввода можно было ввести только определенные значения и этот ввод работал бы с самого запуска программы нужно добавить код:

    //сделать поле ввода активным при запуске программы
    ui->lineEdit->setFocus();
    //разрешен только ввод чисел в поле ввода lineEdit
    QRegExp rx("-?\\d+([.]\\d{0,})?");//
    QValidator *my_Validator = new QRegExpValidator(rx,this);//создание нового объекта QValidator
    ui->lineEdit->setValidator(my_Validator);//подключение регулярного выражения к текстовому полю lineEdit

    и он будет работать сразу при запуске программы.

Работающий образец mainwindow.cpp (сокращенный вариант без некоторых методов для Слотов)

#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QApplication> //подключает класс для работы с QApplication, добавляется обязательно !!!
//#include <QAbstractButton>//
//#include <QWidget> //
//#include <QPushButton> //подключает класс для работы с кнопками, добавляется при необходимости!
//#include <QProgressBar> //подключает класс для работы с QProgressBar, добавляется при необходимости!
//#include <QSlider> //подключает класс для работы с QSlider, добавляется при необходимости!
//#include <QLineEdit> //подключает класс для работы с полем для ввода текста, добавляется при необходимости!
//#include <QLabel> //подключает класс для работы с полем для показа какой-либо информации, добавляется при необходимости!
//#include <QValidator> //подключает класс для фильтра значений, добавляется при необходимости!
//#include <QDoubleValidator> //подключает класс для фильтра числовых значений типа double, добавляется при необходимости!
#include <QRegExpValidator> //подключает класс для фильтра значений через регулярные выражения, добавляется при необходимости!
//#include <QtMath> //подключает класс для математических функций

MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MainWindow)
{
ui->setupUi(this);
connect(ui->pushButton, SIGNAL(clicked()), this, SLOT(addSlot())); //для сложения
connect(ui->pushButton_2, SIGNAL(clicked()), this, SLOT(subtractSlot())); //для вычитания
connect(ui->pushButton_3, SIGNAL(clicked()), this, SLOT(multiplySlot())); //для умножения
connect(ui->pushButton_4, SIGNAL(clicked()), this, SLOT(divideSlot())); //для деления
connect(ui->pushButton_5, SIGNAL(clicked()), this, SLOT(equallySlot())); //для получения результата

//сделать поле ввода активным при запуске программы
ui->lineEdit->setFocus();
//разрешен только ввод чисел в поле ввода lineEdit
QRegExp rx("-?\\d+([.]\\d{0,})?");//
QValidator *my_Validator = new QRegExpValidator(rx,this);//создание нового объекта QValidator
ui->lineEdit->setValidator(my_Validator);//подключение регулярного выражения к текстовому полю lineEdit

}

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

static float firstvalue;//первое введенное значение, пишется static, так как получает значение внутри другой функции
static QString sign;//знак арифметического действия, пишется static, так как получает значение внутри другой функции

void MainWindow::addSlot()
{
::firstvalue= ui->lineEdit->text().toFloat(); // получаем первое значение QLineEdit
::sign = ui->pushButton->text(); // получаем строку из кнопки pushButton +
ui->lineEdit->setFocus();//сделать поле ввода активным
ui->lineEdit->setText(nullptr);//удалить данные из поля ввода
}

void MainWindow::subtractSlot()
{
::firstvalue = ui->lineEdit->text().toFloat(); // получаем первое значение QLineEdit
::sign = ui->pushButton_2->text(); // получаем строку из кнопки pushButton -
ui->lineEdit->setFocus();//сделать поле ввода активным
ui->lineEdit->setText(nullptr);//удалить данные из поля ввода
}

void MainWindow::multiplySlot()
{
::firstvalue = ui->lineEdit->text().toFloat(); // получаем первое значение QLineEdit
::sign = ui->pushButton_3->text(); // получаем строку из кнопки pushButton *
ui->lineEdit->setFocus();//сделать поле ввода активным
ui->lineEdit->setText(nullptr);//удалить данные из поля ввода
}

void MainWindow::divideSlot()
{
::firstvalue = ui->lineEdit->text().toFloat(); // получаем первое значение QLineEdit
::sign = ui->pushButton_4->text(); // получаем строку из кнопки pushButton /
ui->lineEdit->setFocus();//сделать поле ввода активным
ui->lineEdit->setText(nullptr);//удалить данные из поля ввода
}

void MainWindow::equallySlot()
{
float secondvalue = ui->lineEdit->text().toFloat(); // получаем второе значение QLineEdit
float res;//результат, пишется extern, так как получает значение внутри другой функции

if(::sign=='+') {
res=(::firstvalue)+secondvalue;
::firstvalue=secondvalue=0;//обнуление переменных
}
else if (::sign=='-') {
res=(::firstvalue)-secondvalue;
::firstvalue=secondvalue=0;//обнуление переменных
}
else if (::sign=='*') {
res=(::firstvalue)*secondvalue;
::firstvalue=secondvalue=0;//обнуление переменных
}
else if (::sign=='/') {
res=(::firstvalue)/secondvalue;
::firstvalue=secondvalue=0;//обнуление переменных
}
else res=0;

ui->lineEdit->setText(QString::number(res));

}

Как создать простое приложение на C++ с графическим интерфейсом в Qt на Ubuntu

Основные действия для создания программы на C++ в Qt

Набор файлов, необходимых для создания программы в Qt

    При создании программы на C++ в Qt обычно используются файлы:

  • main.cpp – содержит функцию main() с кодом для запуска приложения, и является главным файлом каждого проекта, его обычно можно не редактировать
  • mainwindow.ui – файл графического редактора для добавления элементов в форму окна создаваемого приложения, в нем добавляются виджеты для программы
  • mainwindow.h – заголовочный файл с классами, создаваемыми по умолчанию, также в этом файле регистрируются функции, называемые Слотами, которые подключают самодельный код к программе
  • mainwindow.cpp – файл, в который добавляется почти весь код для работы приложения, основная работа идет с ним

Действия для запуска созданной программы на C++ в Qt

    После создания кода следует нажать в левом окне приложения Qt:

  • Build – для сборки проекта
  • Debug – для выбора компилятора и запуска компиляции программы
  • Run – для запуска приложения из среды Qt

Минимальный набор файлов для создания простого приложения на C++ в Qt, на примере создания программы-калькулятора

Файл main.cpp

Этот код можно оставить, как есть:
#include "mainwindow.h"
#include <QApplication>//подключает класс для работы с QApplication, добавляется обязательно !!!

int main(int argc, char *argv[])
{
QApplication a(argc, argv); //создает экземпляр класса QApplication, обычно он один, должно быть обязательно в коде main()!!!
MainWindow w; //создает окно 'w', оно обычно только одно, должно быть обязательно в коде main()!!!

w.show();//показывает окно приложения 'w' , должно быть обязательно в коде main()!!!
return a.exec();//запускает приложение, должно быть обязательно в коде main()!!!
}

Файл mainwindow.ui

При его выборе появляется графический дизайнер, в котором путем перетаскивания можно добавить в приложение все требуемые виджеты.
При выборе одного элемента QLineEdit (для ввода и вывода данных) и пяти элементов QPushButton, они появятся в окне и по умолчанию будут иметь имена объектов ObjectNamelineEdit, pushButton, pushButton_2, pushButton_3, pushButton_4 и pushButton_5, по которым и нужно будет обращаться к каждому из этих элементов.

Файл mainwindow.h

В этом файле нужно инициировать методы класса MainWindow, для получения ответа программы на какие-либо действия пользователя. Например, нажать кнопку и получить результат, в зависимости от функции, прикрепленной к этой кнопке.
Эти методы инициируются их простым добавлением в раздел private slots: класса class MainWindow : public QMainWindow.
Пример файла:
#ifndef MAINWINDOW_H
#define MAINWINDOW_H
#include <QMainWindow>

namespace Ui {
class MainWindow;
}
class MainWindow : public QMainWindow
{
Q_OBJECT

public:
explicit MainWindow(QWidget *parent = nullptr);
~MainWindow();

private slots:
void addSlot(); // это созданный нами слот для операции +
void subtractSlot(); // это созданный нами слот для операции -
void multiplySlot(); // это созданный нами слот для операции *
void divideSlot(); // это созданный нами слот для операции /
void equallySlot(); // это созданный нами слот для операции =

private:
Ui::MainWindow *ui;
};

#endif // MAINWINDOW_H

И больше в этом файле можно ничего не добавлять.

Файл mainwindow.cpp

Этот файл является основным в приложении.

    Вид кода, который в него помещается:

  • по умолчанию – подключаются заголовочные файлы и классы
    #include "mainwindow.h"
    #include "ui_mainwindow.h"
    #include <QApplication>//подключает класс для работы с QApplication, добавляется обязательно !!!
  • при необходимости – классы для работы с виджетами
    //#include <QAbstractButton>//
    //#include <QWidget> //
    //#include <QPushButton> //подключает класс для работы с кнопками, добавляется при необходимости!
    //#include <QProgressBar> //подключает класс для работы с QProgressBar, добавляется при необходимости!
    //#include <QSlider> //подключает класс для работы с QSlider, добавляется при необходимости!
    //#include <QLineEdit> //подключает класс для работы с полем для ввода текста, добавляется при необходимости!
    //#include <QLabel> //подключает класс для работы с полем для показа какой-либо информации, добавляется при необходимости!
    //#include <QValidator> //подключает класс для фильтра значений, добавляется при необходимости!
    //#include <QDoubleValidator> //подключает класс для фильтра числовых значений типа double, добавляется при необходимости!
    #include <QRegExpValidator> //подключает класс для фильтра значений через регулярные выражения, добавляется при необходимости!
    //#include <QtMath> //подключает класс для математических функций
  • в функцию MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
    , после строки ui->setupUi(this); обычно прописывается связь или связи между объектом, в котором или с которым производятся действия и объектом, который будет выводить результат обработки этих действий.
    Эта связь называется connect(), например:
    ui->setupUi(this);
    connect(ui->pushButton, SIGNAL(clicked()), this, SLOT(addSlot())); //для сложения
    connect(ui->pushButton_2, SIGNAL(clicked()), this, SLOT(subtractSlot())); //для вычитания
    connect(ui->pushButton_3, SIGNAL(clicked()), this, SLOT(multiplySlot())); //для умножения
    connect(ui->pushButton_4, SIGNAL(clicked()), this, SLOT(divideSlot())); //для деления
    connect(ui->pushButton_5, SIGNAL(clicked()), this, SLOT(equallySlot())); //для получения результата
  • В функции connect()должно быть четыре элемента, например:
    ui->pushButton показывает на какой объект надо подействовать, в данном случае это кнопка pushButton
    тип действия, здесь этот сигнал пишется так SIGNAL(clicked()) и обозначает клик по кнопке
    окно, в котором появится ответ, (так как в программе может быть несколько окон), в простейшем приложении окно только одно
    в конце указывается, какая функция должна сработать при клике на кнопку pushButton, например SLOT(addSlot())
  • класс MainWindow::~MainWindow() трогать не надо, он указан по умолчанию
  • после этого можно указать переменные, например:
    static float firstvalue;//первое введенное значение, пишется static, так как получает значение внутри другой функции
    static QString sign;//знак арифметического действия, пишется static, так как получает значение внутри другой функции
  • далее идет определение всех слотов, инициализированных в файле mainwindow.h, например:
    void MainWindow::addSlot()
    {
    ui->lineEdit->setFocus();//сделать поле ввода активным
    ::firstvalue= ui->lineEdit->text().toFloat(); // получаем первое значение QLineEdit
    ::sign = ui->pushButton->text(); // получаем строку из кнопки pushButton +
    ui->lineEdit->setFocus();//сделать поле ввода активным
    ui->lineEdit->setText(nullptr);//удалить данные из поля ввода
    }

    Если таких методов несколько, то они идут по порядку – одна за другой.
  • Если надо добавить в код какие-либо действия, которые должны выполниться при запуске программы их нужно также дописать в том же разделе, что и connect(), то есть после строки ui->setupUi(this);, например, чтобы в поле ввода можно было ввести только определенные значения и этот ввод работал бы с самого запуска программы нужно добавить код:

    //сделать поле ввода активным при запуске программы
    ui->lineEdit->setFocus();
    //разрешен только ввод чисел в поле ввода lineEdit
    QRegExp rx("-?\\d+([.]\\d{0,})?");//
    QValidator *my_Validator = new QRegExpValidator(rx,this);//создание нового объекта QValidator
    ui->lineEdit->setValidator(my_Validator);//подключение регулярного выражения к текстовому полю lineEdit

    и он будет работать сразу при запуске программы.

Работающий образец mainwindow.cpp (сокращенный вариант без некоторых методов для Слотов)

#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QApplication> //подключает класс для работы с QApplication, добавляется обязательно !!!
//#include <QAbstractButton>//
//#include <QWidget> //
//#include <QPushButton> //подключает класс для работы с кнопками, добавляется при необходимости!
//#include <QProgressBar> //подключает класс для работы с QProgressBar, добавляется при необходимости!
//#include <QSlider> //подключает класс для работы с QSlider, добавляется при необходимости!
//#include <QLineEdit> //подключает класс для работы с полем для ввода текста, добавляется при необходимости!
//#include <QLabel> //подключает класс для работы с полем для показа какой-либо информации, добавляется при необходимости!
//#include <QValidator> //подключает класс для фильтра значений, добавляется при необходимости!
//#include <QDoubleValidator> //подключает класс для фильтра числовых значений типа double, добавляется при необходимости!
#include <QRegExpValidator> //подключает класс для фильтра значений через регулярные выражения, добавляется при необходимости!
//#include <QtMath> //подключает класс для математических функций

MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MainWindow)
{
ui->setupUi(this);
connect(ui->pushButton, SIGNAL(clicked()), this, SLOT(addSlot())); //для сложения
connect(ui->pushButton_2, SIGNAL(clicked()), this, SLOT(subtractSlot())); //для вычитания
connect(ui->pushButton_3, SIGNAL(clicked()), this, SLOT(multiplySlot())); //для умножения
connect(ui->pushButton_4, SIGNAL(clicked()), this, SLOT(divideSlot())); //для деления
connect(ui->pushButton_5, SIGNAL(clicked()), this, SLOT(equallySlot())); //для получения результата

//сделать поле ввода активным при запуске программы
ui->lineEdit->setFocus();
//разрешен только ввод чисел в поле ввода lineEdit
QRegExp rx("-?\\d+([.]\\d{0,})?");//
QValidator *my_Validator = new QRegExpValidator(rx,this);//создание нового объекта QValidator
ui->lineEdit->setValidator(my_Validator);//подключение регулярного выражения к текстовому полю lineEdit

}

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

static float firstvalue;//первое введенное значение, пишется static, так как получает значение внутри другой функции
static QString sign;//знак арифметического действия, пишется static, так как получает значение внутри другой функции

void MainWindow::addSlot()
{
::firstvalue= ui->lineEdit->text().toFloat(); // получаем первое значение QLineEdit
::sign = ui->pushButton->text(); // получаем строку из кнопки pushButton +
ui->lineEdit->setFocus();//сделать поле ввода активным
ui->lineEdit->setText(nullptr);//удалить данные из поля ввода
}

void MainWindow::subtractSlot()
{
::firstvalue = ui->lineEdit->text().toFloat(); // получаем первое значение QLineEdit
::sign = ui->pushButton_2->text(); // получаем строку из кнопки pushButton -
ui->lineEdit->setFocus();//сделать поле ввода активным
ui->lineEdit->setText(nullptr);//удалить данные из поля ввода
}

void MainWindow::multiplySlot()
{
::firstvalue = ui->lineEdit->text().toFloat(); // получаем первое значение QLineEdit
::sign = ui->pushButton_3->text(); // получаем строку из кнопки pushButton *
ui->lineEdit->setFocus();//сделать поле ввода активным
ui->lineEdit->setText(nullptr);//удалить данные из поля ввода
}

void MainWindow::divideSlot()
{
::firstvalue = ui->lineEdit->text().toFloat(); // получаем первое значение QLineEdit
::sign = ui->pushButton_4->text(); // получаем строку из кнопки pushButton /
ui->lineEdit->setFocus();//сделать поле ввода активным
ui->lineEdit->setText(nullptr);//удалить данные из поля ввода
}

void MainWindow::equallySlot()
{
float secondvalue = ui->lineEdit->text().toFloat(); // получаем второе значение QLineEdit
float res;//результат, пишется extern, так как получает значение внутри другой функции

if(::sign=='+') {
res=(::firstvalue)+secondvalue;
::firstvalue=secondvalue=0;//обнуление переменных
}
else if (::sign=='-') {
res=(::firstvalue)-secondvalue;
::firstvalue=secondvalue=0;//обнуление переменных
}
else if (::sign=='*') {
res=(::firstvalue)*secondvalue;
::firstvalue=secondvalue=0;//обнуление переменных
}
else if (::sign=='/') {
res=(::firstvalue)/secondvalue;
::firstvalue=secondvalue=0;//обнуление переменных
}
else res=0;

ui->lineEdit->setText(QString::number(res));

}