Название: Упрощение кода
Отправлено: 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. Тут я такого не нашел или искал плохо.
|