2017-02-23 11 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; 
}