2017-02-23 21 views
0

Вопрос о библиотеке TUI C++ https://github.com/gansm/finalcut.Поддержка виджета таблицы/сетки в финальном разрезе?

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

Я использую финальный разрез версии 0.3.0.

ответ

1

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

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 все еще находится в разработке)

0

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

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

#include <final/final.h> 

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> 

// 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; 
} 
Смежные вопросы