Название: Зарядить popup
Отправлено: Igors от Июня 15, 2011, 00:47
Добрый вечер Есть массив данных которые пользователь может выбирать из списка. Когда элемент выбран нужно показать его свойства для редактирования. Структура элемента C++ (Qt) struct CDescriptor { mEditorType; // это поле в UI не отображается mDataType; // а это popup меню в UI ... // значения которые может принимать mEditorType enum { editor_LineText, editor_ColorButton. ... // и.т.л }; // значения которые может принимать mDataType enum { // если mEditorType == editor_LineText, то mDataType может быть одно из data_SignedReal, // "Signed Real" (для popup) data_UnsignedReal, // "Unsigned Real" data_SignedInt, // "Signed Integer" data_UnsignedInt, // "Unsigned Integer" // если mEditorType == editor_ColorButton, то mDataType может быть одно из data_RGB, // "RGB" data_ARGB, // "ARGB" ... // и.т.л }; };
При выбора элемента мне нужно зарядить popup нужными строками и установить selection, а когда пользователь выбрал что-то из popup - поменять значение mDataType. Прямолинейная реализация через if/switch выглядит "не очень хорошо" - значений намного больше чем я привел. Как бы это дело автоматизировать? Замечание: к сожалению, я не могу свободно подобрать нужные константы в enum,, т.к. они используются во внешних модулях) Спасибо
Название: Re: Зарядить popup
Отправлено: Zartul от Июня 15, 2011, 14:43
заводите табличку для EditorType типа C++ (Qt) struct EditorTypeInfo { EditorType editor_type; const DataType * data_types; uint cnt_data_types; };
для каждого типа EditorType определяете массив елементов DataType C++ (Qt) const DataType table_data_types_LineText[] = { data_SignedReal, // "Signed Real" (для popup) data_UnsignedReal, // "Unsigned Real" data_SignedInt, // "Signed Integer" data_UnsignedInt, // "Unsigned Integer" }; const DataTypes table_data_types_ColorButton[] = { data_RGB, // "RGB" data_ARGB, // "ARGB" };
ну и формируете таблицу для каждого типа EditorType C++ (Qt) EditorTypeInfo table_editor_type_info[] = { { editor_LineText, table_data_types_LineText, ARRAY_SIZE( table_data_types_LineText ) }, { editor_ColorButton, table_data_types_ColorButton, ARRAY_SIZE( table_data_types_ColorButton ) }, };
теперь по этой таблице можно перемещаться, находить нужный тип и ходить по массиву его свойств
Название: Re: Зарядить popup
Отправлено: Igors от Июня 15, 2011, 15:24
теперь по этой таблице можно перемещаться, находить нужный тип и ходить по массиву его свойств
Всегда приятно видеть свой код - с небольшими отличиями :) - ARRAY_SIZE у меня был такой C++ (Qt) #define ITEMCOUNT(a) (sizeof(a) / sizeof(a[0]))
- тексты меню тоже нужны, поэтому C++ (Qt) const DataTypes table_data_types_ColorButton[] = { { data_RGB, "RGB" }, { data_ARGB, "ARGB" }, { 0, NULL }, // терминатор чтобы не хранить счетчик (дело вкуса) };
Думал как сделать "по молодежному" (с использованием STL, template и прочей мишуры) - но ничего не придумал :)
|