Russian Qt Forum
Ноябрь 25, 2024, 07:24 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1] 2   Вниз
  Печать  
Автор Тема: Упрощение кода  (Прочитано 6184 раз)
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();

}

Записан
Bepec
Гость
« Ответ #1 : Август 16, 2012, 09:59 »

Ответ - использовать дизайнер. Тогда большая часть интерфейса уйдёт туда.
Записан
Tricitron
Гость
« Ответ #2 : Август 16, 2012, 10:03 »

А без использования дизайнера, то что я понаписал это нормально? имею в виду длину кода.
Записан
gogi
Гость
« Ответ #3 : Август 16, 2012, 10:07 »

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

Я бы сказал проще - описывать интерфейс и настраивать его в cpp - можно. Но приготовься к функциям в тысячи-две строк, когда будет сложный интерфейс Веселый
А так - в принципе нормально, ничего фатального овродя нет, за исключением утечки памяти Улыбающийся
Ну и можно было виджеты объединить в контейнеры. Но это уже на любителя.

PS всё, что создано new, должно удаляться delete.
Записан
Tricitron
Гость
« Ответ #5 : Август 16, 2012, 10:13 »

вот это как то можно упростить, объединить?

Код:
QObject::connect(pb1, SIGNAL(clicked()), te1,SLOT(selectAll()));
    QObject::connect(pb1, SIGNAL(clicked()), te1,SLOT(cut()));
« Последнее редактирование: Август 16, 2012, 10:24 от Tricitron » Записан
kambala
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4747



Просмотр профиля WWW
« Ответ #6 : Август 16, 2012, 10:32 »

это и так самая простая форма записи. конечно можно унаследоваться от типа te1 и создать новый слот, в котором последовательно будут вызываться selectAll() и cut(), но это будет куда больше лишнего кода.
Записан

Изучением C++ вымощена дорога в Qt.

UTF-8 has been around since 1993 and Unicode 2.0 since 1996; if you have created any 8-bit character content since 1996 in anything other than UTF-8, then I hate you. © Matt Gallagher
Tricitron
Гость
« Ответ #7 : Август 16, 2012, 10:33 »

Спасибо всем.
Записан
Bepec
Гость
« Ответ #8 : Август 16, 2012, 10:52 »

Самая простая форма таких слотов - это вот такая:

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

И в результате после компиляции при нажатии на кнопку pb1 будет вызываться слот on_pb1_clicked.
Записан
GreatSnake
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2921



Просмотр профиля
« Ответ #9 : Август 16, 2012, 12:25 »

А так - в принципе нормально, ничего фатального овродя нет, за исключением утечки памяти Улыбающийся
Интересно откуда здесь возьмётся утечка памяти Непонимающий

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

Qt 5.11/4.8.7 (X11/Win)
Bepec
Гость
« Ответ #10 : Август 16, 2012, 13:13 »

Ну как бэ тут всё создаётся new. Динамически выделяется в общемс.

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

Сообщений: 2921



Просмотр профиля
« Ответ #11 : Август 16, 2012, 13:22 »

Ну как бэ тут всё создаётся new. Динамически выделяется в общемс.
Если отработка деструкторов необязательна, а в данном случае надобности я не вижу, то и delete вызывать необязательно. Естественно это справедливо только для данного случая.

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

Qt 5.11/4.8.7 (X11/Win)
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #12 : Август 16, 2012, 13:33 »

Рисовать UI интерактивно - хорошо, использовать код который наколбасит дизайнер - плохо. А как делается это в нативняке? Рисуется диалог в редакторе, затем он грузится из ресурсов. Почему бы здесь не использовать тот же метод, такая возможность есть (QFormBuilder).
Записан
Bepec
Гость
« Ответ #13 : Август 16, 2012, 13:52 »

Ну тут как бэ упрощённый пример. А что будет дальше? Скорее всего вольётся в более большую программу.
Записан
Tricitron
Гость
« Ответ #14 : Август 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();
    }

но создавать ти файла в котором будет по одной строчке как то не рационально)
Записан
Страниц: [1] 2   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.159 секунд. Запросов: 23.