Russian Qt Forum

Qt => Вопросы новичков => Тема начата: Tricitron от Август 16, 2012, 09:50



Название: Упрощение кода
Отправлено: Tricitron от Август 16, 2012, 09:50
Написал вот такую прстенькую програмку которая только и умеет что копировать и вставлять, код громоздкий, но работает. Подскажите что можно упростить и как разбить по файлам, чтобы было не в одном. А допустим создание виджитов и размещение их оставить в main.cpp а сигналы и слоты в другой файл. Сильно не пинайте, я только учусь) ::)

Код:
#include <QtGui>

int main (int argc, char** argv)
{
    QApplication app(argc, argv);

    //============Устанавливаем кодировку=============

    QTextCodec* tc =QTextCodec::codecForName("utf-8");
    QTextCodec::setCodecForTr(tc);
    QTextCodec::setCodecForCStrings(tc);
    QTextCodec::setCodecForLocale(tc);

    //============Создаем виджет========================

    QWidget wdg;

    //============Создаем виджеты для табов========================

    QWidget* wgdTab1 = new QWidget;
    QWidget* wgdTab2 = new QWidget;
    QWidget* wgdTab3 = new QWidget;

    //============Создаем кнопки========================

    QPushButton* pb1 = new QPushButton("button 1/вырезать");

    QPushButton* pb2_1 = new QPushButton("button 2_1");
    QPushButton* pb2_2 = new QPushButton("button 2_2");
    QPushButton* pb2_3 = new QPushButton("button 2_3");

    QPushButton* pb3_1 = new QPushButton("button 3_1");
    QPushButton* pb3_2 = new QPushButton("button 3_2");
    QPushButton* pb3_3 = new QPushButton("button 3_3");

    //============Создаем поля ввода текста========================

    QTextEdit* te1 = new QTextEdit;

    QTextEdit* te2_1 = new QTextEdit;
    QTextEdit* te2_2 = new QTextEdit;
    QTextEdit* te2_3 = new QTextEdit;

    QTextEdit* te3_1 = new QTextEdit;
    QTextEdit* te3_2 = new QTextEdit;
    QTextEdit* te3_3 = new QTextEdit;

    //============Создаем контейнеры группировки========================

    QGroupBox* gb1 = new QGroupBox("GroupBox 1");
    QGroupBox* gb2 = new QGroupBox("GroupBox 2");
    QGroupBox* gb3 = new QGroupBox("GroupBox 3");

    //============Создаем вертикальный главный слой========================

    QVBoxLayout* vboxLayout1 = new QVBoxLayout;

    //============Создаем слои лежащие в контейнерах========================

    QVBoxLayout* vboxLayout2_1 = new QVBoxLayout;
    QVBoxLayout* vboxLayout2_2 = new QVBoxLayout;
    QVBoxLayout* vboxLayout2_3 = new QVBoxLayout;

    //============Создаем слои для TabWidget========================

    QVBoxLayout* vboxLayout3_1 = new QVBoxLayout;
    QVBoxLayout* vboxLayout3_2 = new QVBoxLayout;
    QVBoxLayout* vboxLayout3_3 = new QVBoxLayout;

    //============Создаем горизонтальный слой на котором будут лежать ========================
    //==========================контейнеры групировок================================
    QHBoxLayout* hboxLayout1 = new QHBoxLayout;

    //============Создаем виджет закладок========================

    QTabWidget* twgd1 = new QTabWidget;

    //=============Добавляем табы и устанавливаем на них виджеты=========

    twgd1->addTab(wgdTab1, "wgdTab1");
    twgd1->addTab(wgdTab2, "wgdTab2");
    twgd1->addTab(wgdTab3, "wgdTab3");
//    ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
//    ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

    //te1->setText("dddd агат угу");
    te1->setHtml("one two free один два три");
    QObject::connect(pb1, SIGNAL(clicked()), te1,SLOT(selectAll()));
    QObject::connect(pb1, SIGNAL(clicked()), te1,SLOT(cut()));

    te1->setHtml("one two free один два три");
    QObject::connect(pb3_1, SIGNAL(clicked()), te3_1,SLOT(selectAll()));
    QObject::connect(pb3_1, SIGNAL(clicked()), te3_1,SLOT(paste()));


    //====================================================
    //==================РАЗМЕЩЕНИЕ========================
    //====================================================

    // ---добавляем виджет PushButton (pb1) на главный вертикальный слой
    vboxLayout1->addWidget(pb1);
    // ---добавляем виджет TextEdit (te1) на главный вертикальный слой
    vboxLayout1->addWidget(te1);

    //-----------------------------------------------------------

    // ---добавляем виджеты GroupBox (gb1) на горизонтальный слой
    hboxLayout1->addWidget(gb1);
    hboxLayout1->addWidget(gb2);
    hboxLayout1->addWidget(gb3);

    // ---добавляем слой hboxLayout1 на слой vboxLayout1
    vboxLayout1->addLayout(hboxLayout1);
    // ---добавляем QTabWidget (twgd1) на слой vboxLayout1
    vboxLayout1->addWidget(twgd1);

    // ---Устанавливаем слой vboxLayout2_1 на QGroupBox (gb1)
    gb1->setLayout(vboxLayout2_1);

    // ---добавляем виджет QTextEdit (te2_1)
    vboxLayout2_1->addWidget(te2_1);
    // ---добавляем виджет QPushButton (pb2_1)
    vboxLayout2_1->addWidget(pb2_1);


    // ---Устанавливаем слой vboxLayout2_2 на QGroupBox (gb2)
    gb2->setLayout(vboxLayout2_2);

    // ---добавляем виджет QTextEdit (te2_2)
    vboxLayout2_2->addWidget(te2_2);
    // ---добавляем виджет QPushButton (pb2_2)
    vboxLayout2_2->addWidget(pb2_2);

    // ---Устанавливаем слой vboxLayout2_3 на QGroupBox (gb3)
    gb3->setLayout(vboxLayout2_3);

    // ---добавляем виджет QTextEdit (te2_3)
    vboxLayout2_3->addWidget(te2_3);
    // ---добавляем виджет QPushButton (pb2_3)
    vboxLayout2_3->addWidget(pb2_3);

    //============РАБОТА С ТАБАМИ=================
    wgdTab1->setLayout(vboxLayout3_1);
    wgdTab2->setLayout(vboxLayout3_2);
    wgdTab3->setLayout(vboxLayout3_3);

    vboxLayout3_1->addWidget(te3_1);
    vboxLayout3_2->addWidget(te3_2);
    vboxLayout3_3->addWidget(te3_3);

    vboxLayout3_1->addWidget(pb3_1);
    vboxLayout3_2->addWidget(pb3_2);
    vboxLayout3_3->addWidget(pb3_3);

    // ---Устанавливаем главный слой vboxLayout1 на QWidget (wdg)
    wdg.setLayout(vboxLayout1);

    // ---Устанавливаем заголовок окна
    wdg.setWindowTitle("one");
    // ---Устанавливаем стиль окна
    wdg.setWindowFlags(Qt::Window);
    wdg.show();
    return app.exec();

}



Название: Re: Упрощение кода
Отправлено: Bepec от Август 16, 2012, 09:59
Ответ - использовать дизайнер. Тогда большая часть интерфейса уйдёт туда.


Название: Re: Упрощение кода
Отправлено: Tricitron от Август 16, 2012, 10:03
А без использования дизайнера, то что я понаписал это нормально? имею в виду длину кода.


Название: Re: Упрощение кода
Отправлено: gogi от Август 16, 2012, 10:07
А без использования дизайнера, то что я понаписал это нормально? имею в виду длину кода.
Функции в 160 строк длиной вполне читаемы. На твоём уровне рано ещё думать о рефакторинге и "упрощении".
Но с другой стороны, когда кода будет в десятки раз больше, то будет уже поздно.


Название: Re: Упрощение кода
Отправлено: Bepec от Август 16, 2012, 10:10
Я бы сказал проще - описывать интерфейс и настраивать его в cpp - можно. Но приготовься к функциям в тысячи-две строк, когда будет сложный интерфейс :D
А так - в принципе нормально, ничего фатального овродя нет, за исключением утечки памяти :)
Ну и можно было виджеты объединить в контейнеры. Но это уже на любителя.

PS всё, что создано new, должно удаляться delete.


Название: Re: Упрощение кода
Отправлено: Tricitron от Август 16, 2012, 10:13
вот это как то можно упростить, объединить?

Код:
QObject::connect(pb1, SIGNAL(clicked()), te1,SLOT(selectAll()));
    QObject::connect(pb1, SIGNAL(clicked()), te1,SLOT(cut()));


Название: Re: Упрощение кода
Отправлено: kambala от Август 16, 2012, 10:32
это и так самая простая форма записи. конечно можно унаследоваться от типа te1 и создать новый слот, в котором последовательно будут вызываться selectAll() и cut(), но это будет куда больше лишнего кода.


Название: Re: Упрощение кода
Отправлено: Tricitron от Август 16, 2012, 10:33
Спасибо всем.


Название: Re: Упрощение кода
Отправлено: Bepec от Август 16, 2012, 10:52
Самая простая форма таких слотов - это вот такая:

Создаёшь слот on_ИмяОбъекта_ИмяСигнала(Параметры сигнала).
Как пример
Код:
private slots:
   void on_pb1_clicked()

И в результате после компиляции при нажатии на кнопку pb1 будет вызываться слот on_pb1_clicked.


Название: Re: Упрощение кода
Отправлено: GreatSnake от Август 16, 2012, 12:25
А так - в принципе нормально, ничего фатального овродя нет, за исключением утечки памяти :)
Интересно откуда здесь возьмётся утечка памяти ???

Цитировать
PS всё, что создано new, должно удаляться delete.
почему именно здесь нужно это делать ???


Название: Re: Упрощение кода
Отправлено: Bepec от Август 16, 2012, 13:13
Ну как бэ тут всё создаётся new. Динамически выделяется в общемс.

Конечно я могу ошибаться - к примеру опять таки зловредный вопрос - если дитятке с new присвоить родителя, родитель за ней приберётся или нет? (Где то я уже задавал этот вопрос, но уже забыл :) )


Название: Re: Упрощение кода
Отправлено: GreatSnake от Август 16, 2012, 13:22
Ну как бэ тут всё создаётся new. Динамически выделяется в общемс.
Если отработка деструкторов необязательна, а в данном случае надобности я не вижу, то и delete вызывать необязательно. Естественно это справедливо только для данного случая.

Цитировать
Конечно я могу ошибаться - к примеру опять таки зловредный вопрос - если дитятке с new присвоить родителя, родитель за ней приберётся или нет? (Где то я уже задавал этот вопрос, но уже забыл :) )
Приберётся)
Только причём это здесь ???


Название: Re: Упрощение кода
Отправлено: Igors от Август 16, 2012, 13:33
Рисовать UI интерактивно - хорошо, использовать код который наколбасит дизайнер - плохо. А как делается это в нативняке? Рисуется диалог в редакторе, затем он грузится из ресурсов. Почему бы здесь не использовать тот же метод, такая возможность есть (QFormBuilder).


Название: Re: Упрощение кода
Отправлено: Bepec от Август 16, 2012, 13:52
Ну тут как бэ упрощённый пример. А что будет дальше? Скорее всего вольётся в более большую программу.


Название: Re: Упрощение кода
Отправлено: Tricitron от Август 16, 2012, 14:23
Еще вот такой вопрос, есть файл в котором записано следующее Автор\компания\телефон разделенные между собой какими-нибудь знаками.

как мне их загрузить сюда

QTextEdit* te2_1 = new QTextEdit;
QTextEdit* te2_2 = new QTextEdit;
QTextEdit* te2_3 = new QTextEdit;

полностью все из файла в QTextEdit я считать могу.

Код:
QFile file1 ("one");
    if (file1.open(QIODevice::ReadOnly)) {
        QTextStream stream1(&file1);
        te3_1->setText(stream1.readAll());
        file1.close();
    }

но создавать ти файла в котором будет по одной строчке как то не рационально)


Название: Re: Упрощение кода
Отправлено: Kurles от Август 16, 2012, 14:31
Учимся пользоваться асистентом )
Код
C++ (Qt)
QString QTextStream::readLine ( qint64 maxlen = 0 )
QStringList QString::split ( const QString & sep, SplitBehavior behavior = KeepEmptyParts, Qt::CaseSensitivity cs = Qt::CaseSensitive ) const


Название: Re: Упрощение кода
Отправлено: Tricitron от Август 16, 2012, 14:38
Помнится на делфи когда то загружал строки из XML. Тут я такого не нашел или искал плохо.