Поддержка виджета таблицы / сетки в финальной версии?

Вопрос о библиотеке TUI C ++ https://github.com/gansm/finalcut.

  • Каков наилучший способ показать пару ключ: значение в виджете? Для этого я использую объекты FLabel (с разными цветами для ключа и значения). Но позвольте мне продолжить …
  • Как показать список пар ключ: значение?
  • И толкая это еще дальше, как мне показать таблицу? Есть ли планы поддержать его в будущем?

Я использую окончательную версию 0.3.0.

0

Решение

В Final Cut нет виджета, который может обрабатывать хранилища значений ключей. Было бы очень интересно иметь виджет, который показывает стандартные элементы контейнера напрямую, без необходимости вставлять элементы отдельно. Но вы можете заполнить виджет FListBox значениями из ассоциативного контейнера.

using namespace finalcut;

FListBox*  list = new FListBox (this);
list->setGeometry(1, 1, 7, 7);

std::map<char,int> ascii;
std::map<char,int>::iterator iter, begin, end;

ascii['@'] = 0x40;
ascii['A'] = 0x41;
ascii['B'] = 0x42;
ascii['C'] = 0x43;
begin = ascii.begin();
end = ascii.end();

for (iter = begin; iter != end; ++iter )
list->insert (iter->second);

// Jump in the list to item ascii['B']
int n = int(std::distance(begin, ascii.find('B') ));
list->setCurrentItem(n+1);

// Stupid indirect access: value that is mapped to key 'C'.
n = int(std::distance(begin, ascii.find('C') ));
FListBoxItem item = list->getItem(n+1);
FMessageBox::info (this, "Value[C]", item.getText());

В будущем также запланирован виджет с именем FListView. Здесь можно будет иметь более одного столбца. Это должно позволить вам табличное представление ваших данных.

Или вы клонируете текущий репозиторий git и используете совершенно новый виджет FScrollView. Здесь вы можете разместить несколько виджетов FLabel в прокручиваемой области просмотра. (Осторожно: FScrollView все еще находится в стадии разработки)

1

Другие решения

В текущей версии окончательного варианта git-репозитория виджет FListBox может импортировать данные из контейнера STL. Вы можете импортировать данные непосредственно при вставке или позже при первом доступе через «ленивое преобразование». Все, что вам нужно, это небольшая вспомогательная функция.

Прямой импорт

#include <final/final.h>

using namespace finalcut;

static FString* temp_str = 0;

// Direct import helper functions
FString& IntToString (std::vector<int>::const_iterator iter)
{
return temp_str->setNumber(*iter);
}

int main (int argc, char* argv[])
{
FApplication app(argc, argv);

FDialog dialog ("List example", &app);
dialog.setGeometry (30, 2, 22, 22);

FListBox list (&dialog);
list.setText ("Direct import");
list.setGeometry (1, 1, 20, 19);

int n = 0;
temp_str = new FString;
std::vector<int> v(100,0);
std::vector<int>::iterator iter = v.begin();

while ( iter != v.end() )
{
n++;
*iter = n;
++iter;
}

list.insert (v.begin(), v.end(), IntToString);
delete temp_str;

app.setMainWidget(&dialog);
dialog.show();
return app.exec();
}

Импорт через ленивое преобразование

#include <final/final.h>

using namespace finalcut;

// Lazy conversion helper functions
void IntToString (FListBoxItem& item, FWidget::data_ptr container, int index)
{
std::vector<int>* vec = static_cast<std::vector<int>*>(container);
int n = (*vec)[index];
item.setText ("      " + FString().setNumber(n));
}

int main (int argc, char* argv[])
{
FApplication app(argc, argv);

FDialog dialog ("List example", &app);
dialog.setGeometry (30, 2, 22, 22);

FListBox list (&dialog);
list.setText ("Lazy conversion");
list.setGeometry (1, 1, 20, 19);

int n = 0;
std::vector<int>* v = new std::vector<int>(100,0);
std::vector<int>::iterator iter = v->begin();

while ( iter != v->end() )
{
*iter = n;
(n%2 != 0) ? n++ : n+=3;
++iter;
}

list.insert (v, IntToString);

app.setMainWidget(&dialog);
dialog.show();
int ret = app.exec();
delete v;
return ret;
}
0

По вопросам рекламы [email protected]