Home > Кодинг, Компьютер, Проги, С++, Qt > Qt. Первый проект с классами.

Qt. Первый проект с классами.

Итак, сегодня я расскажу о классах в Qt. И мы напишем первую программу с использованием классов.

Создадим  новый проект. Файл -> Новый файл или проект -> Проект Qt C++ – GUI приложение Qt. Назовём его firstProject и укажем желаемое размещение.


Назовём класс – CMyFirstDialog, базовый класс путь будет QDialog, а заголовочный файл и файл исходников класса будут называться MyFirstDialog.h и MyFirstDialog.cpp соответственно. Не забудьте убрать галочку напротив “Создать форму” – QtDesigner кошмарно мусорит при создании кода.

Исходники прилагаются.

Замутим вот такую программку.

Исходники вот такие:

1.  MyFirstDialog.h

#ifndef MYFIRSTDIALOG_H
#define MYFIRSTDIALOG_H

#include <QtGui/QDialog>
//Родительский класс.

#include <QVBoxLayout>
//Один из основных компонентов. Всё, что лежит на форме - лежит на своём Layot'е. 
//Это очень удобно: при изменении размеров формы все компоненты на ней будут
//красиво двигаться.

#include <QLabel>
//Заголовочный файл с label'ом - именно на ней мы будем писать стандартное приветствие.

class CMyFirstDialog : public QDialog
{
    Q_OBJECT
    //Не забегая вперед, скажу лишь, что этот макрос нужен для механизма
    //сигнал - слот (signal - slot)

public:
    CMyFirstDialog(QWidget *parent = 0);
    //Конструктор класса - публичный метод

    ~CMyFirstDialog();
    //Деструктор класса - тоже

private:
    QVBoxLayout*    m_pMainLayout;
    //Программка небольшая, поэтому слой всего один и он вертикальный 
    //(QVBoxLayout - здесь "V" - vertical)

    QLabel*         m_pHelloLabel;
    //Собственно, сама метка.
};

#endif // MYFIRSTDIALOG_H

2.  MyFirstDialog.cpp

#include "MyFirstDialog.h"

CMyFirstDialog::CMyFirstDialog(QWidget *parent)
    : QDialog(parent) //Конструктор
{
    m_pMainLayout = new QVBoxLayout(this);
    //Создаем слой. this указывает на то, что слой будет лежать на форме.

    m_pHelloLabel = new QLabel("Здравствуй, Мир!");
    //Создаем новую метку с необходимым текстом...

    m_pMainLayout->addWidget(m_pHelloLabel);
    //... и кладём её на слой
}

CMyFirstDialog::~CMyFirstDialog()
{
//Деструктор. Здесь ничего писать не требуется. Всё автоматизировано.
}

3.main.cpp

Оставляем без изменений.

И теперь нажимаем на зеленый треугольник в правом нижнем углу. Если Вы всё сделали правильно, то спустя несколько секунд появится окошко с текстом.

И вот барабанная дробь. Фанфары! Окно на экране. Но что это за иероглифы?

А это, друзья, проблемы с кодировкой. Какая кодировка у нас, в Windows? Правильно, CP1251.

И чтобы не было иероглифов, надо указать явно, что необходимо использовать именно её. Для этого надо открыть файл  main.cpp и добавить в него пару строчек, чтобы он стал таким:

#include <QtGui/QApplication>
//Присоединяется Самая Главная Библиотека

#include "MyFirstDialog.h"
//Библиотека с кодом нашего класса 

#include <QTextCodec>
//Хедер для функции QTextCodec::setCodecForTr.

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    //Инициализация оконной подсистемы
    //Создание объекта приложения с параметрами, указанными в скобках.

    QTextCodec::setCodecForTr(QTextCodec::codecForName("Windows-1251"));
    //Настройка перевода кодировки текстов.
    //Все тексты будут при переводе отображаться в кодировке Windows-1251

    CMyFirstDialog w;
    //Создание экземпляра класса

    w.show();
    //Показ экранной формы

    return a.exec();
    //Аналог getch();
}

Но даже и после этих исправлений текст будет состоять из кракозябр, а не кириллицы. И правильно. Указать – то кодировку мы указали, но текст так и остался непонятным. Как заставить Qt перевести его в нужную нам кодовую страницу?

По имени функции setCodecForTr легко догадаться, что она “устанавливает кодовую страницу для Tr”. А Tr – функция, которая нас и избавит от кракозябр.

В файле MyFirstDialog.cpp изменим одну строчку.

Вместо

m_pHelloLabel = new QLabel("Здравствуй, Мир!");

напишем

m_pHelloLabel = new QLabel(QObject::tr("Здравствуй, Мир!"));

А вот и наша функция tr. Она и переведет наш текст в Windows-1251.
А после нажатия на зеленый треугольник появится окно с читабельной строкой.

На этом закончим. В следующий раз я расскажу о табличном layout’е и механизме signal-slot.
Спасибо за внимание.

По мотивам курса dev.ansus.ru.

Advertisements
  1. lesushka
    24.11.2010 at 01:23

    все четко и понятно! Доступно даже самым потерянным читателям) Здорово! спасибо=)

  2. gcc
    10.02.2011 at 11:22

    хм, странно конструктор без explicit

  3. 01.07.2011 at 18:45

    О прям в точку! Спасибо за материал, ждем продолжения 😉

  1. No trackbacks yet.

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s

%d bloggers like this: