Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Вопрос про организацию кода, Ликбез по QT 
V
    Опции темы
azesmcar
Дата 4.8.2009, 09:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


uploading...
****


Профиль
Группа: Участник Клуба
Сообщений: 6291
Регистрация: 12.11.2004
Где: Армения

Репутация: 3
Всего: 211



Доброе утро,

Я начал изучение Qt (и не только Qt, весь GUI в целом smile ). В общем-то я GUI писал когда еще маленький был и опыта практически нету. Сейчас написал кое-что на Qt, смотрю - самому противно. Хотелось бы расспросить как у вас обстоит с этим делом. Приступим...

1. Насколько правильно использовать ui файлы? Он после обработки UI файла выделяет всю инициализацию в отдельный класс (файл) и вроде бы все чистенько, аккуратненько, но...
Но сгенерированный файл менять нельзя, иногда Designer генерирует там фигню какую-то, которую из designer-а никак изменить нельзя. Например при использовании класса QTreeWidget, он генерирует названия для колонок (1, 2, 3, 4...), разумеется приходится менять у себя в файле. Получается что инициализация не вся в одном месте, еще и два раза выполняется одно действие.  smile 
Да и кстати я смотрю на примеры в Qt, ни один из них не использовал ui файлы.

2. Создал окошко, все прекрасно, теперь начинаем добавлять кнопочки и форточки. Добавил одну кнопку, другую, третью...через некоторое время код становится похожим на кучу какашек. Все обработчики в одном файле, не класс а недоразумение какое-то. Возникает желание выделить логику программы куда нибудь. Сейчас сделал так
mainwindow.h - заголовочный файл
mainwindow.cpp - реализация логики программы
mainwindow_i.cpp - инициализация кнопочек, установка событий (настройки интерфейса короче)
mainwindow_e.cpp - реализация slot -ов.

Почему-то мне это нормальным не кажется. Как вы организовываете код? Все эти функции, события...ничего общего с ООП этот класс уже не имеет. И монолитный какой-то. Потому всегда не любил GUI, надеюсь все это можно привести в порядок, чтобы я по прежнему мог без рвотного рефлекса смотреть на собственный код. smile 

Спасибо.

Это сообщение отредактировал(а) azesmcar - 4.8.2009, 09:02
PM   Вверх
SABROG
Дата 4.8.2009, 09:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Hacker
****


Профиль
Группа: Завсегдатай
Сообщений: 2481
Регистрация: 18.9.2006

Репутация: 81
Всего: 91



Цитата(azesmcar @  4.8.2009,  09:00 Найти цитируемый пост)
Например при использовании класса QTreeWidget, он генерирует названия для колонок (1, 2, 3, 4...), разумеется приходится менять у себя в файле.

Имена колонок можно из дизайнера изменить.

Цитата(azesmcar @  4.8.2009,  09:00 Найти цитируемый пост)
Да и кстати я смотрю на примеры в Qt, ни один из них не использовал ui файлы.

.ui скорее для статики. Если приходится часто наследоваться, динамически создавать/уничтожать виджеты. В общем не программа, а дискотека, тогда придется всё вручную вбивать. К тому же примеры остаются примерами, их должно быть удобно читать, серьезными приложениями их не назвать. Но примеры такие все-таки есть:

Код

$(QTDIR)/examples/activeqt/webbrowser
$(QTDIR)/examples/dbus/dbus-chat
$(QTDIR)/examples/dbus/remotecontrolledcar
$(QTDIR)/examples/designer/calculatorbuilder
$(QTDIR)/examples/designer/calculatorform
$(QTDIR)/examples/designer/worldtimeclockbuilder
$(QTDIR)/examples/graphicsview/padnavigator
$(QTDIR)/examples/help/contextsensitivehelp
$(QTDIR)/examples/help/remotecontrol
$(QTDIR)/examples/ipc/sharedmemory
$(QTDIR)/examples/itemviews/editabletreemodel
$(QTDIR)/examples/network/http
$(QTDIR)/examples/network/network-chat
$(QTDIR)/examples/network/securesocketclient
$(QTDIR)/examples/network/torrent
$(QTDIR)/examples/painting/fontsampler
$(QTDIR)/examples/painting/svggenerator
$(QTDIR)/examples/qmake/precompile
$(QTDIR)/examples/script/calculator
$(QTDIR)/examples/script/qstetrix
$(QTDIR)/examples/uitools/multipleinheritance
$(QTDIR)/examples/uitools/textfinder
$(QTDIR)/examples/webkit/formextractor
$(QTDIR)/examples/webkit/googlechat
$(QTDIR)/examples/webkit/previewer
$(QTDIR)/examples/widgets/stylesheet
$(QTDIR)/examples/widgets/validators
$(QTDIR)/examples/xmlpatterns/filetree
$(QTDIR)/examples/xmlpatterns/qobjectxmlmodel
$(QTDIR)/examples/xmlpatterns/recipes
$(QTDIR)/examples/xmlpatterns/trafficinfo


Цитата

Все обработчики в одном файле


Можно написать всего один слот для всех кнопок на форму на базе QAbstractButton, если так будет удобней.

Цитата(azesmcar @  4.8.2009,  09:00 Найти цитируемый пост)
Как вы организовываете код?

На каждую новую форму - новую пару классов newform.h, newform.cpp. А так, чтобы выносить слоты и инициализацию в отдельные файлы, я этим не занимаюсь. Меня в принципе это устраивает.


--------------------
Национальная группа Russian Federation на QtCentre.
PM MAIL   Вверх
azesmcar
Дата 4.8.2009, 09:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


uploading...
****


Профиль
Группа: Участник Клуба
Сообщений: 6291
Регистрация: 12.11.2004
Где: Армения

Репутация: 3
Всего: 211



Цитата(SABROG @  4.8.2009,  09:22 Найти цитируемый пост)
Имена колонок можно из дизайнера изменить.

Скорее всего не нашел. Поищу еще.

Цитата(SABROG @  4.8.2009,  09:22 Найти цитируемый пост)

.ui скорее для статики. Если приходится часто наследоваться, динамически создавать/уничтожать виджеты. В общем не программа, а дискотека, тогда придется всё вручную вбивать. К тому же примеры остаются примерами, их должно быть удобно читать, серьезными приложениями их не назвать. Но примеры такие все-таки есть:

Это все ясно, просто интересно как вообще принято.

Цитата(SABROG @  4.8.2009,  09:22 Найти цитируемый пост)

Можно написать всего один слот для всех кнопок на форму на базе QAbstractButton, если так будет удобней.

Ну речь шла не только о кнопках, я для примера написал кнопка. Не все можно в одну функцию направлять..и даже если можно, это не всегда удачная идея, так как логически эти кнопки могут выполнять совершенно разные функции, нарушается принцип "одна функция - одна задача".

Цитата(SABROG @  4.8.2009,  09:22 Найти цитируемый пост)

На каждую новую форму - новую пару классов newform.h, newform.cpp. А так, чтобы выносить слоты и инициализацию в отдельные файлы, я этим не занимаюсь. Меня в принципе это устраивает.

А логику где пишешь? В том же классе?
PM   Вверх
VC15
Дата 4.8.2009, 10:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 5
Регистрация: 4.8.2009

Репутация: нет
Всего: нет



Я обычно делаю так. Один элемент GUI - это один .h, один .cpp и один .ui. Каша, которая творится в сгенерированном исходнике, меня не смущает - главное, чтобы работало правильно.
В дизайнере я стараюсь делать максимум настроек, чтобы как можно меньше писать самому. Ну а дополнительную инициализацию осуществляю в конструкторе. Получается, что реализация GUI-класса содержит две части - дополнительную инициализацию элементов управления и собственно логику работы. Конечно, и то, и другое может иметь невероятно большой объём, но в этом случае нужно либо перепроектировать свой класс, разбив его на несколько, либо смириться с этим и использовать IDE, обеспечивающую удобную навигацию по коду (например Eclipse), что избавляет тебя от постоянного пролистывания огромных кусков инициализирующего кода.
PM MAIL   Вверх
azesmcar
Дата 4.8.2009, 10:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


uploading...
****


Профиль
Группа: Участник Клуба
Сообщений: 6291
Регистрация: 12.11.2004
Где: Армения

Репутация: 3
Всего: 211



Цитата(VC15 @  4.8.2009,  10:30 Найти цитируемый пост)
Я обычно делаю так. Один элемент GUI - это один .h, один .cpp и один .ui. Каша, которая творится в сгенерированном исходнике, меня не смущает - главное, чтобы работало правильно.
В дизайнере я стараюсь делать максимум настроек, чтобы как можно меньше писать самому. Ну а дополнительную инициализацию осуществляю в конструкторе. Получается, что реализация GUI-класса содержит две части - дополнительную инициализацию элементов управления и собственно логику работы. Конечно, и то, и другое может иметь невероятно большой объём, но в этом случае нужно либо перепроектировать свой класс, разбив его на несколько, либо смириться с этим и использовать IDE, обеспечивающую удобную навигацию по коду (например Eclipse), что избавляет тебя от постоянного пролистывания огромных кусков инициализирующего кода. 

Ну инициализацию можно вынести в отдельный файл и самому, но дело не в этом.
Например.
Создал я прекрасное окошко, меня оно восхищает своим внешним видом и

Цитата(VC15 @  4.8.2009,  10:30 Найти цитируемый пост)
Каша, которая творится в сгенерированном исходнике, меня не смущает

QSystemTrayIcon как я понал в дизайнере нельзя установить и настроить, т.е. писать его (и не только его) придется в самом коде (поскольку в кашу ручками нельзя лезть). Получается что половина инициализаций в одном файле, половина в другом. Уже безобразие. Но это еще не все. Теперь о событиях...
Некоторые события имеют отношение к логике программы а не которые нет (например мне нужно перехватить onMouseOver на какой нибудь кнопочке и как-то очень красиво ее покрасить в гламурно зеленый smile), тут уже совсем путаница. Отделить логику от интерфейса никак не получается, хотя и это событие и нажатие на ту же кнопку, по которому мне нужно будет загрузить файл из интернета тоже.
 smile 

Это сообщение отредактировал(а) azesmcar - 4.8.2009, 11:39
PM   Вверх
pan2004
Дата 4.8.2009, 12:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 357
Регистрация: 28.7.2007

Репутация: 6
Всего: 9



Цитата(azesmcar @  4.8.2009,  10:36 Найти цитируемый пост)
Некоторые события имеют отношение к логике программы а не которые нет (например мне нужно перехватить onMouseOver на какой нибудь кнопочке и как-то очень красиво ее покрасить в гламурно зеленый ), тут уже совсем путаница. Отделить логику от интерфейса никак не получается, хотя и это событие и нажатие на ту же кнопку, по которому мне нужно будет загрузить файл из интернета тоже.

Пока придется мириться с таким "смешением", или ждать прихода Qt Kinetic


--------------------
Qt4/C++ fan
WinXP SP3: MSVC++2005 Qt4.5.1 Boost1.39
сыграем в дурака?
PM MAIL   Вверх
azesmcar
Дата 4.8.2009, 12:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


uploading...
****


Профиль
Группа: Участник Клуба
Сообщений: 6291
Регистрация: 12.11.2004
Где: Армения

Репутация: 3
Всего: 211



Цитата(pan2004 @  4.8.2009,  12:44 Найти цитируемый пост)
Пока придется мириться с таким "смешением", или ждать прихода Qt Kinetic 

Что, совсем никак что ли? Плохо что тут нужна и обратная связь, получается либо все бросать в кучу, либо связь типа - все знают обо всех. 
Ладно, это еще ничего, я вот не могу понять что делать с первым вопросом.

Цитата(azesmcar @  4.8.2009,  10:36 Найти цитируемый пост)
QSystemTrayIcon как я понал в дизайнере нельзя установить и настроить, т.е. писать его (и не только его) придется в самом коде (поскольку в кашу ручками нельзя лезть). Получается что половина инициализаций в одном файле, половина в другом. Уже безобразие. 

Если я буду использовать ui файл, как я потом создам tray icon? В дизайнере его я не нашел как поставить, в самом коде это писать что ли?


Это сообщение отредактировал(а) azesmcar - 4.8.2009, 12:56
PM   Вверх
pan2004
Дата 4.8.2009, 13:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 357
Регистрация: 28.7.2007

Репутация: 6
Всего: 9



Цитата(azesmcar @  4.8.2009,  12:49 Найти цитируемый пост)
Получается что половина инициализаций в одном файле, половина в другом. Уже безобразие. 

В данном примере - а чем плохо? Очевидно, что QSystemTrayIcon не имеет никакого отношения к форме(не говоря о том, что рисуется в системе совсем в другом месте), и инициализироваться должен отдельно.


--------------------
Qt4/C++ fan
WinXP SP3: MSVC++2005 Qt4.5.1 Boost1.39
сыграем в дурака?
PM MAIL   Вверх
azesmcar
Дата 4.8.2009, 13:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


uploading...
****


Профиль
Группа: Участник Клуба
Сообщений: 6291
Регистрация: 12.11.2004
Где: Армения

Репутация: 3
Всего: 211



Цитата(pan2004 @  4.8.2009,  13:20 Найти цитируемый пост)

В данном примере - а чем плохо? Очевидно, что QSystemTrayIcon не имеет никакого отношения к форме(не говоря о том, что рисуется в системе совсем в другом месте), и инициализироваться должен отдельно. 

К форме - да, но он имеет отношение к пользовательскому интерфейсу. Так куда же его можно засунуть? В принципе он и к логике программы никакого отношения не имеет. smile 

Да еще и это не только Tray icon а идущий за ним QMenu и целый вагон QAction -ов. smile 
Код становиться похожим на свалку.

Это сообщение отредактировал(а) azesmcar - 4.8.2009, 13:24
PM   Вверх
VC15
Дата 4.8.2009, 13:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 5
Регистрация: 4.8.2009

Репутация: нет
Всего: нет



Знаешь, по-моему ты слишком сильно заморачиваешься. Получается, что классификация кода и размещение его по отдельным файлам - это самоцель. На мой взгляд, гораздо важнее грамотно спроектировать классы с точки зрения их функциональности, а где и как находится код - это второй вопрос. Повторюсь, что использование хорошей IDE решает проблему навигации по коду.
PM MAIL   Вверх
pan2004
Дата 4.8.2009, 13:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 357
Регистрация: 28.7.2007

Репутация: 6
Всего: 9



Цитата(azesmcar @  4.8.2009,  13:22 Найти цитируемый пост)
Да еще и это не только Tray icon а идущий за ним QMenu и целый вагон QAction -ов.

Оба вполне спокойно добавляются и редактируются через дизайнер


--------------------
Qt4/C++ fan
WinXP SP3: MSVC++2005 Qt4.5.1 Boost1.39
сыграем в дурака?
PM MAIL   Вверх
azesmcar
Дата 4.8.2009, 14:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


uploading...
****


Профиль
Группа: Участник Клуба
Сообщений: 6291
Регистрация: 12.11.2004
Где: Армения

Репутация: 3
Всего: 211



Цитата(VC15 @  4.8.2009,  13:52 Найти цитируемый пост)
Знаешь, по-моему ты слишком сильно заморачиваешься. Получается, что классификация кода и размещение его по отдельным файлам - это самоцель. На мой взгляд, гораздо важнее грамотно спроектировать классы с точки зрения их функциональности, а где и как находится код - это второй вопрос. Повторюсь, что использование хорошей IDE решает проблему навигации по коду. 

Возможно, я идеалист...
Нет, в принципе сама цель на данный момент изучение, так что мне особо не важно сколько времени уйдет на написание программы, но хотелось бы научится делать правильно, нет у меня опыта в разработке GUI, может это и нормально, но только я не видел кода грамотно написанного на Qt и не знаю с чем сравнивать. Я сравниваю со своими кодами, с кодами написанными в компаниях в которых я работал (речь идет о не GUI программах) и этот код явно проигрывает в читабельности и вообще в красоте, во всех понятиях этого слова.
Применить MVC? Для каждой формы наследовать три класса...тоже не дело. Речь не о размещении файлов, а о разделении интерфейса и логики. Покажите мне грамотный во всех понятиях GUI код написанный на Qt и я успокоюсь если там будет свалено все в кучу smile 
Если нет - научусь как надо.

Action и Menu - да, TrayIcon - нет, я не пойму куда его внедрить, в какой модуль программы.

Цитата(VC15 @  4.8.2009,  13:52 Найти цитируемый пост)
На мой взгляд, гораздо важнее грамотно спроектировать классы с точки зрения их функциональности, а где и как находится код - это второй вопрос

так речь именно об этом. Не получается грамотно спроектировать классы форм (на мой взгляд грамотно). По сути, интерфейс пользователя и логика - разные сущности, но они должны знать друг о друге..это никак не стыкуется с моими понятиями о нормальном коде. Потому и хочется понять, как люди разрабатывают GUI, что считается нормой. Как другие разделяют логику от реализации, каким способом.

Давайте рассмотрим пример, так будет понятнее.

Допустим
Нужно написать калькулятор
нам нужно ОДНО окно и множество кнопочек на нем.
как вы организуете класс окна, где поместите логику программы (функции подсчетов и так далее).

У меня нет пока мышления GUI разработчика, хотелось бы чтобы появилось.

Это сообщение отредактировал(а) azesmcar - 4.8.2009, 14:10
PM   Вверх
andrew_121
Дата 4.8.2009, 14:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Кодофей
****


Профиль
Группа: Завсегдатай
Сообщений: 3448
Регистрация: 3.1.2008

Репутация: 11
Всего: 33



azesmcar, Объясни, какие файлы у тебя генеряться при создании одного .ui файла.


--------------------
Удалил аккаунт. Прощайте!
PM MAIL   Вверх
azesmcar
Дата 4.8.2009, 14:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


uploading...
****


Профиль
Группа: Участник Клуба
Сообщений: 6291
Регистрация: 12.11.2004
Где: Армения

Репутация: 3
Всего: 211



Цитата(andrew_121 @  4.8.2009,  14:17 Найти цитируемый пост)
azesmcar, Объясни, какие файлы у тебя генеряться при создании одного .ui файла. 

А что, они отличаются от тех, что генерируются у других?
Один заголовочный файл, там создание всех визуальных элементов и установка из значений в функции setupUi и основной файл использующий первый.


Это сообщение отредактировал(а) azesmcar - 4.8.2009, 14:21
PM   Вверх
andrew_121
Дата 4.8.2009, 14:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Кодофей
****


Профиль
Группа: Завсегдатай
Сообщений: 3448
Регистрация: 3.1.2008

Репутация: 11
Всего: 33



Т.е.
Допустим форма зовется MainForm, файл mainform.uiuic сгенерит из него .h файл. В конце которого будет:
Код

namespace Ui {
    class MainForm: public Ui_MainForm {};
} // namespace Ui

Значит все ГУИ объекты в пространстве имен Ui. Унаследуйся, добавь свои методы. Инициализацию для каждого пиши в .cpp файле.


--------------------
Удалил аккаунт. Прощайте!
PM MAIL   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С/С++: Кроссплатформенное программирование, QT/Gtk+/wxWidgets"
JackYF
Любитель
  • В заголовке темы в квадратных скобках обозначьте используемую вами библиотеку, например: [QT],[GTK],[wx].
  • Если вопрос актуален только для некоторой версии библиотеки, либо, если вы пользуетесь не самой последней версией, укажите это. Например: [QT4], [GTK2].
  • Все начинающие изучать Qt - не забудьте зайти сюда.
  • Проставьте несколько ключевых слов темы, чтобы её можно было легче найти.
  • В вопросе укажите полную версию версию библиотеки, а также все дополнительные используемые программные пакеты.
  • Не забывайте пользоваться кнопкой "Код".
  • Телепатов на форуме нет! Задавайте чёткий, конкретный и полный вопрос. Указывайте полностью ошибки компилятора и компоновщика.
  • Новое сообщение должно иметь прямое отношение к тематике этого раздела. Флуд, флейм, оффтопик запрещены.
  • Категорически запрещается обсуждение вареза, "кряков", взлома программ и т.д.

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, Любитель.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | С/С++: Кроссплатформенное программирование, Qt/Gtk+/wxWidgets | Следующая тема »


 




[ Время генерации скрипта: 0.0915 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.