c++ - wxWidgets - 将数据添加到 DataViewListCtrl
问题描述
我正在尝试创建一个用于管理音频样本库的应用程序wxWidgets
,我DirCtrl
在左侧和DataViewListCtrl
右侧有一个,当用户导航到一个文件夹并双击一个文件时,它应该使用提取其标签和音频属性taglib
并将它们添加到特定列。我在弄清楚如何将数据添加到DataViewListCtrl
我最近在 python 中做了类似的事情时遇到了一些麻烦,而 python 使用 2D 列表向其中添加数据。
我必须DataViewListCtrl
在 C++中添加数据的函数
void Browser::OnClickDirCtrl(wxCommandEvent& event)
{
TagLib::FileRef File (DirCtrl->GetFilePath());
TagLib::String Artist = File.tag()->artist();
TagLib::String Album = File.tag()->album();
TagLib::String Genre = File.tag()->genre();
TagLib::String Title = File.tag()->title();
TagLib::String Comment = File.tag()->comment();
int Bitrate = File.audioProperties()->bitrate();
int Channels = File.audioProperties()->channels();
int Length = File.audioProperties()->lengthInMilliseconds();
int LengthSec = File.audioProperties()->lengthInSeconds();
int SampleRate = File.audioProperties()->sampleRate();
std::cout << "Artist: " << Artist << std::endl;
std::cout << "Album: "<< Album << std::endl;
std::cout << "Genre:" << Genre << std::endl;
std::cout << "Title: " << Title << std::endl;
std::cout << "Comment: " << Comment << std::endl;
std::cout << "Bitrate: " << Bitrate << std::endl;
std::cout << "Channels: " << Channels << std::endl;
std::cout << "Length: " << Length << std::endl;
std::cout << "Length in seconds: " << LengthSec << std::endl;
std::cout << "Sample rate: " << SampleRate << std::endl;
std::vector<DataView> Data;
// wxVector<wxVariant> Data;
Data.clear();
// Data.push_back(Artist);
Data.push_back({false, Title, Artist, Channels, Length, SampleRate, Bitrate, Comment});
}
DataView
在同一个struct
类中声明的位置在哪里。
struct DataView
{
bool Fav;
TagLib::String Title;
TagLib::String Artist;
int Channel;
int Length;
int SampleRate;
int Bitrate;
TagLib::String Comment;
};
但是当我试图建立这个说法时我得到了一个错误
../src/Browser.cpp: In member function ‘void Browser::OnClickDirCtrl(wxCommandEvent&)’:
../src/Browser.cpp:267:32: error: cannot convert ‘std::vector<Browser::DataView>’ to ‘const wxVector<wxVariant>&’
267 | SampleListView->AppendItem(Data);
| ^~~~
| |
| std::vector<Browser::DataView>
但是如果我尝试wxVector<wxVariant>
改用,我会收到一条错误消息
../src/Browser.cpp: In member function ‘void Browser::OnClickDirCtrl(wxCommandEvent&)’:
../src/Browser.cpp:266:90: error: cannot convert ‘<brace-enclosed initializer list>’ to ‘const value_type&’ {aka ‘const wxVariant&’}
266 | Data.push_back({false, Title, Artist, Channels, Length, SampleRate, Bitrate, Comment});
| ^
解决方案
根据您尝试将数据添加到列表视图的方式,我假设列的设置如下:
m_dataViewListCtrl->AppendToggleColumn("Fav");
m_dataViewListCtrl->AppendTextColumn("Title");
m_dataViewListCtrl->AppendTextColumn("Artist");
m_dataViewListCtrl->AppendTextColumn("Channels");
m_dataViewListCtrl->AppendTextColumn("Length");
m_dataViewListCtrl->AppendTextColumn("SampleRate");
m_dataViewListCtrl->AppendTextColumn("Bitrate");
m_dataViewListCtrl->AppendTextColumn("Comment");
尽管 Channels 和 Bitrate 之类的东西是数字,但由于 wxDataViewListCtrl 仅提供几种类型的列,我猜测使用了文本。我也使用m_dataViewListCtrl
控件的名称。请务必将其更改为您正在使用的名称。
为了向控件添加数据,您首先需要一个实用函数来将 TagLib 字符串转换为 wxStrings。
wxString TagLibTowx(const TagLib::String& in)
{
return wxString::FromUTF8(in.toCString(true));
}
然后要将数据添加到控件,您将执行以下操作:
void Browser::OnClickDirCtrl(wxCommandEvent& event)
{
TagLib::FileRef File (DirCtrl->GetFilePath());
TagLib::String Artist = File.tag()->artist();
TagLib::String Title = File.tag()->title();
TagLib::String Comment = File.tag()->comment();
int Bitrate = File.audioProperties()->bitrate();
int Channels = File.audioProperties()->channels();
int LengthSec = File.audioProperties()->lengthInSeconds();
int SampleRate = File.audioProperties()->sampleRate();
wxVector<wxVariant> data;
data.push_back(false);
data.push_back(TagLibTowx(Title));
data.push_back(TagLibTowx(Artist));
data.push_back(wxString::Format("%d",Channels));
data.push_back(wxString::Format("%d",LengthSec));
data.push_back(wxString::Format("%d",SampleRate));
data.push_back(wxString::Format("%d",Bitrate));
data.push_back(TagLibTowx(Comment));
m_dataViewListCtrl->AppendItem(data);
}
如果您有其他列使用您从文件中提取的其他数据,希望很清楚如何针对您拥有的列进行调整。
顺便问一下,这条线TagLib::FileRef File (DirCtrl->GetFilePath());
适合你吗?const char*
为了让 TagLib 接受文件名,我必须添加一个演员表。
推荐阅读
- javascript - 如何使用 Angular 6 从 iframe 获取数据
- javascript - 将 upTime 函数从 Javascript 转换为 Jquery,并对多个 ID 使用单个函数
- python - 如何访问 MMAX2 带注释的 XML 语料库中的数据
- generics - 在 java 中显式调用默认方法 - 当实现的接口使用泛型时
- lazarus - TProcess 中的 `free` 方法有什么作用?
- javascript - 两个带有常用下拉菜单的 D3.js 热图
- firebase - Firebase 托管部署到其他站点
- azure-devops - 啊哈!<>VSTS 集成 - 啊哈!在 VSTS 中调整了 Stack Rank - 关于还原的提示?
- ruby-on-rails - Rails 模型错误未知属性在保存时使用 belongs_to 和 has_many
- postgresql - Postgres 数据库 drop 很慢