![]() |
|
![]() ![]() ![]() |
|
azesmcar |
|
|||
![]() uploading... ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 6291 Регистрация: 12.11.2004 Где: Армения Репутация: 3 Всего: 211 |
Доброе утро,
Я начал изучение Qt (и не только Qt, весь GUI в целом ![]() 1. Насколько правильно использовать ui файлы? Он после обработки UI файла выделяет всю инициализацию в отдельный класс (файл) и вроде бы все чистенько, аккуратненько, но... Но сгенерированный файл менять нельзя, иногда Designer генерирует там фигню какую-то, которую из designer-а никак изменить нельзя. Например при использовании класса QTreeWidget, он генерирует названия для колонок (1, 2, 3, 4...), разумеется приходится менять у себя в файле. Получается что инициализация не вся в одном месте, еще и два раза выполняется одно действие. ![]() Да и кстати я смотрю на примеры в Qt, ни один из них не использовал ui файлы. 2. Создал окошко, все прекрасно, теперь начинаем добавлять кнопочки и форточки. Добавил одну кнопку, другую, третью...через некоторое время код становится похожим на кучу какашек. Все обработчики в одном файле, не класс а недоразумение какое-то. Возникает желание выделить логику программы куда нибудь. Сейчас сделал так mainwindow.h - заголовочный файл mainwindow.cpp - реализация логики программы mainwindow_i.cpp - инициализация кнопочек, установка событий (настройки интерфейса короче) mainwindow_e.cpp - реализация slot -ов. Почему-то мне это нормальным не кажется. Как вы организовываете код? Все эти функции, события...ничего общего с ООП этот класс уже не имеет. И монолитный какой-то. Потому всегда не любил GUI, надеюсь все это можно привести в порядок, чтобы я по прежнему мог без рвотного рефлекса смотреть на собственный код. ![]() Спасибо. Это сообщение отредактировал(а) azesmcar - 4.8.2009, 09:02 |
|||
|
||||
SABROG |
|
||||||||
![]() Hacker ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2481 Регистрация: 18.9.2006 Репутация: 81 Всего: 91 |
Имена колонок можно из дизайнера изменить.
.ui скорее для статики. Если приходится часто наследоваться, динамически создавать/уничтожать виджеты. В общем не программа, а дискотека, тогда придется всё вручную вбивать. К тому же примеры остаются примерами, их должно быть удобно читать, серьезными приложениями их не назвать. Но примеры такие все-таки есть:
Можно написать всего один слот для всех кнопок на форму на базе QAbstractButton, если так будет удобней. На каждую новую форму - новую пару классов newform.h, newform.cpp. А так, чтобы выносить слоты и инициализацию в отдельные файлы, я этим не занимаюсь. Меня в принципе это устраивает. |
||||||||
|
|||||||||
azesmcar |
|
|||
![]() uploading... ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 6291 Регистрация: 12.11.2004 Где: Армения Репутация: 3 Всего: 211 |
Скорее всего не нашел. Поищу еще. Это все ясно, просто интересно как вообще принято.
Ну речь шла не только о кнопках, я для примера написал кнопка. Не все можно в одну функцию направлять..и даже если можно, это не всегда удачная идея, так как логически эти кнопки могут выполнять совершенно разные функции, нарушается принцип "одна функция - одна задача". А логику где пишешь? В том же классе? |
|||
|
||||
VC15 |
|
|||
![]() Новичок Профиль Группа: Участник Сообщений: 5 Регистрация: 4.8.2009 Репутация: нет Всего: нет |
Я обычно делаю так. Один элемент GUI - это один .h, один .cpp и один .ui. Каша, которая творится в сгенерированном исходнике, меня не смущает - главное, чтобы работало правильно.
В дизайнере я стараюсь делать максимум настроек, чтобы как можно меньше писать самому. Ну а дополнительную инициализацию осуществляю в конструкторе. Получается, что реализация GUI-класса содержит две части - дополнительную инициализацию элементов управления и собственно логику работы. Конечно, и то, и другое может иметь невероятно большой объём, но в этом случае нужно либо перепроектировать свой класс, разбив его на несколько, либо смириться с этим и использовать IDE, обеспечивающую удобную навигацию по коду (например Eclipse), что избавляет тебя от постоянного пролистывания огромных кусков инициализирующего кода. |
|||
|
||||
azesmcar |
|
|||
![]() uploading... ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 6291 Регистрация: 12.11.2004 Где: Армения Репутация: 3 Всего: 211 |
Ну инициализацию можно вынести в отдельный файл и самому, но дело не в этом. Например. Создал я прекрасное окошко, меня оно восхищает своим внешним видом и QSystemTrayIcon как я понал в дизайнере нельзя установить и настроить, т.е. писать его (и не только его) придется в самом коде (поскольку в кашу ручками нельзя лезть). Получается что половина инициализаций в одном файле, половина в другом. Уже безобразие. Но это еще не все. Теперь о событиях... Некоторые события имеют отношение к логике программы а не которые нет (например мне нужно перехватить onMouseOver на какой нибудь кнопочке и как-то очень красиво ее покрасить в гламурно зеленый ![]() ![]() Это сообщение отредактировал(а) azesmcar - 4.8.2009, 11:39 |
|||
|
||||
pan2004 |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 357 Регистрация: 28.7.2007 Репутация: 6 Всего: 9 |
Пока придется мириться с таким "смешением", или ждать прихода Qt Kinetic |
|||
|
||||
azesmcar |
|
|||
![]() uploading... ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 6291 Регистрация: 12.11.2004 Где: Армения Репутация: 3 Всего: 211 |
Что, совсем никак что ли? Плохо что тут нужна и обратная связь, получается либо все бросать в кучу, либо связь типа - все знают обо всех. Ладно, это еще ничего, я вот не могу понять что делать с первым вопросом. Если я буду использовать ui файл, как я потом создам tray icon? В дизайнере его я не нашел как поставить, в самом коде это писать что ли? Это сообщение отредактировал(а) azesmcar - 4.8.2009, 12:56 |
|||
|
||||
pan2004 |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 357 Регистрация: 28.7.2007 Репутация: 6 Всего: 9 |
В данном примере - а чем плохо? Очевидно, что QSystemTrayIcon не имеет никакого отношения к форме(не говоря о том, что рисуется в системе совсем в другом месте), и инициализироваться должен отдельно. |
|||
|
||||
azesmcar |
|
|||
![]() uploading... ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 6291 Регистрация: 12.11.2004 Где: Армения Репутация: 3 Всего: 211 |
К форме - да, но он имеет отношение к пользовательскому интерфейсу. Так куда же его можно засунуть? В принципе он и к логике программы никакого отношения не имеет. ![]() Да еще и это не только Tray icon а идущий за ним QMenu и целый вагон QAction -ов. ![]() Код становиться похожим на свалку. Это сообщение отредактировал(а) azesmcar - 4.8.2009, 13:24 |
|||
|
||||
VC15 |
|
|||
![]() Новичок Профиль Группа: Участник Сообщений: 5 Регистрация: 4.8.2009 Репутация: нет Всего: нет |
Знаешь, по-моему ты слишком сильно заморачиваешься. Получается, что классификация кода и размещение его по отдельным файлам - это самоцель. На мой взгляд, гораздо важнее грамотно спроектировать классы с точки зрения их функциональности, а где и как находится код - это второй вопрос. Повторюсь, что использование хорошей IDE решает проблему навигации по коду.
|
|||
|
||||
pan2004 |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 357 Регистрация: 28.7.2007 Репутация: 6 Всего: 9 |
||||
|
||||
azesmcar |
|
|||
![]() uploading... ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 6291 Регистрация: 12.11.2004 Где: Армения Репутация: 3 Всего: 211 |
Возможно, я идеалист... Нет, в принципе сама цель на данный момент изучение, так что мне особо не важно сколько времени уйдет на написание программы, но хотелось бы научится делать правильно, нет у меня опыта в разработке GUI, может это и нормально, но только я не видел кода грамотно написанного на Qt и не знаю с чем сравнивать. Я сравниваю со своими кодами, с кодами написанными в компаниях в которых я работал (речь идет о не GUI программах) и этот код явно проигрывает в читабельности и вообще в красоте, во всех понятиях этого слова. Применить MVC? Для каждой формы наследовать три класса...тоже не дело. Речь не о размещении файлов, а о разделении интерфейса и логики. Покажите мне грамотный во всех понятиях GUI код написанный на Qt и я успокоюсь если там будет свалено все в кучу ![]() Если нет - научусь как надо. Action и Menu - да, TrayIcon - нет, я не пойму куда его внедрить, в какой модуль программы.
так речь именно об этом. Не получается грамотно спроектировать классы форм (на мой взгляд грамотно). По сути, интерфейс пользователя и логика - разные сущности, но они должны знать друг о друге..это никак не стыкуется с моими понятиями о нормальном коде. Потому и хочется понять, как люди разрабатывают GUI, что считается нормой. Как другие разделяют логику от реализации, каким способом. Давайте рассмотрим пример, так будет понятнее. Допустим Нужно написать калькулятор нам нужно ОДНО окно и множество кнопочек на нем. как вы организуете класс окна, где поместите логику программы (функции подсчетов и так далее). У меня нет пока мышления GUI разработчика, хотелось бы чтобы появилось. Это сообщение отредактировал(а) azesmcar - 4.8.2009, 14:10 |
|||
|
||||
andrew_121 |
|
|||
![]() Кодофей ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3448 Регистрация: 3.1.2008 Репутация: 11 Всего: 33 |
azesmcar, Объясни, какие файлы у тебя генеряться при создании одного .ui файла.
-------------------- Удалил аккаунт. Прощайте! |
|||
|
||||
azesmcar |
|
|||
![]() uploading... ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 6291 Регистрация: 12.11.2004 Где: Армения Репутация: 3 Всего: 211 |
А что, они отличаются от тех, что генерируются у других? Один заголовочный файл, там создание всех визуальных элементов и установка из значений в функции setupUi и основной файл использующий первый. Это сообщение отредактировал(а) azesmcar - 4.8.2009, 14:21 |
|||
|
||||
andrew_121 |
|
|||
![]() Кодофей ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3448 Регистрация: 3.1.2008 Репутация: 11 Всего: 33 |
Т.е.
Допустим форма зовется MainForm, файл mainform.ui. uic сгенерит из него .h файл. В конце которого будет:
Значит все ГУИ объекты в пространстве имен Ui. Унаследуйся, добавь свои методы. Инициализацию для каждого пиши в .cpp файле. -------------------- Удалил аккаунт. Прощайте! |
|||
|
||||
![]() ![]() ![]() |
Правила форума "С/С++: Кроссплатформенное программирование, QT/Gtk+/wxWidgets" | |
|
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, Любитель. |
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | С/С++: Кроссплатформенное программирование, Qt/Gtk+/wxWidgets | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |