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

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

Страниц: [1] 2   Вниз
  Печать  
Автор Тема: Проектирование и написание интерфейса  (Прочитано 9226 раз)
lega4
Гость
« : Май 12, 2011, 20:08 »

Когда начал изучать Qt, довольно бросилось в глаза, что в книжках "интерфейс" проектируется, так сказать, прямо в коде
Код
C++ (Qt)
...
Qlabel* lbl=newQLabel("Hello");
lbl->show();
...
 
После визуального проектирования в Delphi или MSVS это довольно непривычно, но, с другой стороны, имеет смысл. Но сейчас вот начал писать приложение не "хелловорлд", а чуть более серьезное, с десятком элементов управления: label'ы, lineedit'ы, кнопки. И возник такой вопрос - как это принято делать в Qt?
1. То же визуальное проектирование, к примеру, на вкладке "Дизайн" Qt Creator'a. Рисуем формочку, потом ее "натягиваем" на наше окошко (как, кстати?) и все хорошо.
2. Пишем в коде все эти QLabel* MyLabel14=new QLabel("Hello"). Если так, то вопрос тот же - как это принято делать? Ручками объявлять два десятка лейблов с разными именами или заводить массив указателей на QLabel* и в нем в цикле просоздавать нужные элементы?
Записан
Пантер
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 5876


Жаждущий знаний


Просмотр профиля WWW
« Ответ #1 : Май 12, 2011, 20:38 »

Для начала лучше всего писать все в коде. Когда разберешься с библиотекой, можешь делать все в дизайнере, потому что так быстрее.
Записан

1. Qt - Qt Development Frameworks; QT - QuickTime
2. Не используйте в исходниках символы кириллицы!!!
3. Пользуйтесь тегом code при оформлении сообщений.
kambala
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4727



Просмотр профиля WWW
« Ответ #2 : Май 12, 2011, 22:06 »

можно в дизайнер набросать контролы и выставить свойства, а их лейаут делать в коде - потом будет удобнее (и быстрее) добавлять/удалять/перемещать элементы интерфейса
Записан

Изучением 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
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #3 : Май 12, 2011, 23:26 »

Лучше накидать UI в дизайнере, но ни в коем случае не совать сделанный им код - он становится обузой. Вместо этого сохранить нарисованное как .ui файл в ресурсах и потом его загружать. Нужные контролы доставать по имени. Получается довольно удобно
Записан
lit-uriy
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 3880


Просмотр профиля WWW
« Ответ #4 : Май 13, 2011, 10:13 »

Лучше накидать UI в дизайнере, но ни в коем случае не совать сделанный им код - он становится обузой. Вместо этого сохранить нарисованное как .ui файл в ресурсах и потом его загружать. ... Получается довольно удобно
Что-то про нарисованное я не понял, что нарисованное?
Удобство динамически загружаемого ui-файла я понимаю, а вот засовывания его в ресурсы совсем не понимаю.
Т.к. динамически загружать мы уже не можем (всё в бинаре) дак зачем же совать ui-файл в ресурсы?
Записан

Юра.
lit-uriy
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 3880


Просмотр профиля WWW
« Ответ #5 : Май 13, 2011, 10:20 »

lega4 в Qt существует несколько способов использования ui-файлов:
1) Прямое использование класса созданного uic (например, как член класса-окна)
2) Использование множественного наследования (от виджета и класса формы)
3) Динамическая загрузка ui-файла с помощью QUiLoader

Ну и без ui-файлов можно создавать интерфейс.

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

ui-файлы, как в дельфях - статика. Весь динамизм интерфейса создаётся в коде.
Можно часть сделать в дизайнере, а часть в коде
Записан

Юра.
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #6 : Май 13, 2011, 12:21 »

Удобство динамически загружаемого ui-файла я понимаю, а вот засовывания его в ресурсы совсем не понимаю.
Т.к. динамически загружать мы уже не можем (всё в бинаре) дак зачем же совать ui-файл в ресурсы?
3) Динамическая загрузка ui-файла с помощью QUiLoader
ui-файлы, как в дельфях - статика. Весь динамизм интерфейса создаётся в коде.
Можно часть сделать в дизайнере, а часть в коде
Неясно что у Вас "статика" а что "динамика" Улыбающийся  Я имел ввиду простую вещь, пример

Код
C++ (Qt)
void MyDialog::SetupUI( void )
{
// загружаем что наваяли в дизайнере (со всеми созданными там сигналами и.т.п)
QFormBuilder builder;
QFile file(QString(":/UI/MyWidget.ui"));
file.open(QFile::ReadOnly);
QWidget * w = builder.load(&file, this);
file.close();
if (!w) Error("Can't load resource MyWidget.ui");
 
// подгоняем размер диалога под созданный в дизайнере
setMinimumSize(w->minimumSize());
setMaximumSize(w->maximumSize());
 
// заполняем члены класса - виджеты с которыми хотим что-то делать
mEdit1 = GetEditByName("Edit1");
...
}
 
QLineEdit * MyDialog::GetEditByName( const char * name )
{
QLineEdit * e = findChild <QLineEdit *>(name);
if (!e) Error(QString("Can't find QLineEdit resource\n") + name);
return e;
}
 
Записан
GreatSnake
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2921



Просмотр профиля
« Ответ #7 : Май 13, 2011, 12:35 »

Цитата: lit-uriy
Удобство динамически загружаемого ui-файла я понимаю, а вот засовывания его в ресурсы совсем не понимаю.
Т.к. динамически загружать мы уже не можем (всё в бинаре) дак зачем же совать ui-файл в ресурсы?
Никто нам не запрещает запихнуть все *.ui в .qrc и потом его скомпилить и влинковать в бинарник.
Ведь QFile всё равно откуда читать файл из ресурсов или отдельного файла.
Записан

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

Сообщений: 3880


Просмотр профиля WWW
« Ответ #8 : Май 13, 2011, 21:46 »

>>Никто нам не запрещает
к чему это, я не понял.
Записан

Юра.
lit-uriy
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 3880


Просмотр профиля WWW
« Ответ #9 : Май 13, 2011, 21:48 »

>>Неясно что у Вас "статика" а что "динамика"
интерфейс (окно) меняется во время работы - динамичен, появляются (при необходимости) новые виджеты исчезают другие.
Записан

Юра.
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #10 : Май 14, 2011, 10:41 »

>>Неясно что у Вас "статика" а что "динамика"
интерфейс (окно) меняется во время работы - динамичен, появляются (при необходимости) новые виджеты исчезают другие.
Нет помех делать это с загруженным виджетом так же как и с созданным без всякого дизайнера. Загрузка бесполезна если приложение создает виджеты о которых само заранее не знает (типа "создавать UI на лету") - но это случай редкий. Гораздо чаще надо скрывать/показывать куски UI что определены и значит могут быть сделаны в дизайнере
Записан
GreatSnake
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2921



Просмотр профиля
« Ответ #11 : Май 14, 2011, 13:17 »

Цитировать
Удобство динамически загружаемого ui-файла я понимаю, а вот засовывания его в ресурсы совсем не понимаю.
Т.к. динамически загружать мы уже не можем (всё в бинаре) дак зачем же совать ui-файл в ресурсы?
Сорри, сразу не понял, что имелось в виду.
Считаю огромным плюсом динамической подгрузки ui-файла то, что перегрузив QUiLoader::createWidget(), я могу управлять созданием виджетов. Например, при определенных условиях мне на форме нужен или QLineEdit или QComboBox, QCheckBox или QLabel и т.д.
Таким образом, я могу пере-использовать одну форму во многих случаях.
При статической линковке ui такое делать, имхо, невозможно.
И в таком случае уже не важно влинкован ui-файл в ресурсы или грузится отдельно.
Записан

Qt 5.11/4.8.7 (X11/Win)
kolob
Частый гость
***
Offline Offline

Сообщений: 296



Просмотр профиля
« Ответ #12 : Май 24, 2011, 09:45 »

А создание интерфейса в дизайнере, а потом наследование класса этого интерфейса для реализации в нем основных действий. Как вы считаете это правильно?
В ассистенте это вроде один из методов проектирования. Только я что то ни видел тут на форуму что бы кто то так проектировал.
Записан

Qt 5.11.0, Win, MinGW
lit-uriy
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 3880


Просмотр профиля WWW
« Ответ #13 : Май 24, 2011, 19:25 »

kolob, при наследовании, в заголовочнике нового класса ты обязан написать:
#include "ui_form.h"
А ведь этот заголовочник включается в другие файлы. Если проект большой, то перекомпиляция при каждом изменении ui-файла занимает значительное время.

В случае же агрегации через указатель, можно использовать в заголовочнике нового класса только предобъявление (forward declaration). Это существенно ускоряет компиляцию, т.к. перекомпилировать нужно только один cpp-файл (нового класса).
Записан

Юра.
kolob
Частый гость
***
Offline Offline

Сообщений: 296



Просмотр профиля
« Ответ #14 : Май 24, 2011, 19:50 »

lit-uriy а могли бы дать ссылку туда где можно про это почитать и как это использовать. В ассистенте такого я не видел.
Записан

Qt 5.11.0, Win, MinGW
Страниц: [1] 2   Вверх
  Печать  
 
Перейти в:  


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