1

问题是关于 TUI C++ 库https://github.com/gansm/finalcut

  • 在小部件中显示键:值对的最佳方式是什么?我暂时使用 FLabel 对象(键和值的颜色不同)。但是让我继续...
  • 如何显示键:值对列表?
  • 更进一步,我如何展示一张桌子?未来有支持它的计划吗?

我使用最终版本 0.3.0。

4

2 回答 2

1

Final Cut 没有能够处理键值存储的小部件。拥有一个直接显示标准容器元素而无需单独插入项目的小部件会非常有趣。但是您可以使用关联容器中的值填充 FListBox 小部件。

using namespace finalcut;

FListBox*  list = new FListBox (this);
list->setGeometry(FPoint(1, 1), FSize(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 仍在开发中)

于 2017-02-23T20:11:54.007 回答
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 (FPoint(30, 2), FSize(22, 22));

  FListBox list (&dialog);
  list.setText ("Direct import");
  list.setGeometry (FPoint(1, 1), FSize(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, FDataAccess* container, int index)
{
  auto& vec = flistboxhelper::getContainer<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 (FPoint(30, 2), FSize(22, 22));

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

  int n = 0;
  std::vector<int> v(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();
  return ret;
}

最后修改:即将发布的 0.7.0 版本的代码更改

于 2017-05-20T21:02:57.700 回答