C++ wxWidgets-如何不将任何内容推回wxVector?
我有一个应用程序,用户可以将文件插入C++ wxWidgets-如何不将任何内容推回wxVector?,c++,wxwidgets,C++,Wxwidgets,我有一个应用程序,用户可以将文件插入wxDataViewListCtrl,并有一个数据库来存储有关文件的所有信息。我有一个名为LoadDatabase()的函数,当用户关闭时,将数据库加载回应用程序,然后重新启动应用程序,如下所示 wxVector<wxVector<wxVariant>> Database::LoadDatabase(wxVector<wxVector<wxVariant>>& vecSet, wxTreeCtrl&
wxDataViewListCtrl
,并有一个数据库来存储有关文件的所有信息。我有一个名为LoadDatabase()
的函数,当用户关闭时,将数据库加载回应用程序,然后重新启动应用程序,如下所示
wxVector<wxVector<wxVariant>> Database::LoadDatabase(wxVector<wxVector<wxVariant>>& vecSet, wxTreeCtrl& favorite_tree, wxTreeItemId& favorite_item, wxTreeCtrl& trash_tree, wxTreeItemId& trash_item)
{
try
{
if (sqlite3_open("Samples.db", &m_Database) != SQLITE_OK)
{
wxLogDebug("Error opening DB");
throw sqlite3_errmsg(m_Database);
}
std::string load = "SELECT FAVORITE, FILENAME, SAMPLEPACK, TYPE, \
CHANNELS, LENGTH, SAMPLERATE, BITRATE, TRASHED \
FROM SAMPLES;";
rc = sqlite3_prepare_v2(m_Database, load.c_str(), load.size(), &m_Stmt, NULL);
if (rc == SQLITE_OK)
{
int row = 0;
while (SQLITE_ROW == sqlite3_step(m_Stmt))
{
wxLogDebug("Record found, fetching..");
int c1 = sqlite3_column_int(m_Stmt, 0);
wxString c2 = wxString(std::string(reinterpret_cast< const char* >(sqlite3_column_text(m_Stmt, 1))));
wxString c3 = wxString(std::string(reinterpret_cast< const char* >(sqlite3_column_text(m_Stmt, 2))));
wxString c4 = std::string(reinterpret_cast<const char *>(sqlite3_column_text(m_Stmt, 3)));
int c5 = sqlite3_column_int(m_Stmt, 4);
int c6 = sqlite3_column_int(m_Stmt, 5);
int c7 = sqlite3_column_int(m_Stmt, 6);
int c8 = sqlite3_column_int(m_Stmt, 7);
int c9 = sqlite3_column_int(m_Stmt, 8);
wxVector<wxVariant> vec;
if (c1 == 1)
{
vec.push_back(true);
vec.push_back(c2);
vec.push_back(c3);
vec.push_back(c4);
vec.push_back(wxString::Format("%d",c5));
vec.push_back(wxString::Format("%d",c6));
vec.push_back(wxString::Format("%d",c7));
vec.push_back(wxString::Format("%d",c8));
favorite_tree.AppendItem(favorite_item, c2);
}
else if (c9 == 1)
{
vec.push_back(false);
vec.push_back(c2);
vec.push_back(c3);
vec.push_back(c4);
vec.push_back(wxString::Format("%d",c5));
vec.push_back(wxString::Format("%d",c6));
vec.push_back(wxString::Format("%d",c7));
vec.push_back(wxString::Format("%d",c8));
trash_tree.AppendItem(trash_item, c2);
}
else
{
vec.push_back(false);
vec.push_back(c2);
vec.push_back(c3);
vec.push_back(c4);
vec.push_back(wxString::Format("%d",c5));
vec.push_back(wxString::Format("%d",c6));
vec.push_back(wxString::Format("%d",c7));
vec.push_back(wxString::Format("%d",c8));
}
vecSet.push_back(vec);
row++;
}
}
else
{
wxMessageDialog* msgDialog = new wxMessageDialog(NULL, "Error! Cannot load data from table.", "Error", wxOK | wxICON_ERROR);
msgDialog->ShowModal();
sqlite3_free(m_ErrMsg);
}
rc = sqlite3_finalize(m_Stmt);
sqlite3_close(m_Database);
}
catch (const std::exception &exception)
{
wxLogDebug(exception.what());
}
return vecSet;
}
SampleListView
这里是wxDataViewListCtrl
,我希望当c9==1
不返回任何内容时,只需将该项的文件名附加到垃圾树中即可。因为如果我将任何内容推回到vec
,它将被添加到SampleListView
这是我得到的错误,
我不确定我是否理解你的问题,但你的意思是这样的吗
wxVector<wxVariant> vec;
if (c9 == 1)
{
trash_tree.AppendItem(trash_item, c2);
}
else
{
if (c1 == 1)
{
vec.push_back(true);
favorite_tree.AppendItem(favorite_item, c2);
}
else
vec.push_back(false);
vecSet.push_back(vec);
vec.push_back(c2);
vec.push_back(c3);
vec.push_back(c4);
vec.push_back(wxString::Format("%d",c5));
vec.push_back(wxString::Format("%d",c6));
vec.push_back(wxString::Format("%d",c7));
vec.push_back(wxString::Format("%d",c8));
}
wxvec;
如果(c9==1)
{
垃圾树。附件项(垃圾树项,c2);
}
其他的
{
如果(c1==1)
{
向量推回(真);
favorite_树。AppendItem(favorite_项,c2);
}
其他的
向量推回(假);
vecSet.推回(vec);
矢量推回(c2);
向量推回(c3);
向量推回(c4);
vec.push_back(wxString::Format(“%d”,c5));
vec.push_back(wxString::Format(“%d”,c6));
vec.push_back(wxString::Format(“%d”,c7));
vec.push_back(wxString::Format(“%d”,c8));
}
我根据您在上面共享的代码修改了代码
wxVector<wxVector<wxVariant>> Database::LoadDatabase(wxVector<wxVector<wxVariant>>& vecSet, wxTreeCtrl& favorite_tree, wxTreeItemId& favorite_item, wxTreeCtrl& trash_tree, wxTreeItemId& trash_item)
{
try
{
if (sqlite3_open("Samples.db", &m_Database) != SQLITE_OK)
{
wxLogDebug("Error opening DB");
throw sqlite3_errmsg(m_Database);
}
std::string load = "SELECT FAVORITE, FILENAME, SAMPLEPACK, TYPE, \
CHANNELS, LENGTH, SAMPLERATE, BITRATE, TRASHED \
FROM SAMPLES;";
rc = sqlite3_prepare_v2(m_Database, load.c_str(), load.size(), &m_Stmt, NULL);
if (rc == SQLITE_OK)
{
int row = 0;
while (SQLITE_ROW == sqlite3_step(m_Stmt))
{
wxLogDebug("Record found, fetching..");
int c1 = sqlite3_column_int(m_Stmt, 0);
wxString c2 = wxString(std::string(reinterpret_cast< const char* >(sqlite3_column_text(m_Stmt, 1))));
wxString c3 = wxString(std::string(reinterpret_cast< const char* >(sqlite3_column_text(m_Stmt, 2))));
wxString c4 = std::string(reinterpret_cast<const char *>(sqlite3_column_text(m_Stmt, 3)));
int c5 = sqlite3_column_int(m_Stmt, 4);
int c6 = sqlite3_column_int(m_Stmt, 5);
int c7 = sqlite3_column_int(m_Stmt, 6);
int c8 = sqlite3_column_int(m_Stmt, 7);
int c9 = sqlite3_column_int(m_Stmt, 8);
wxVector<wxVariant> vec;
if (c9 == 1)
{
trash_tree.AppendItem(trash_item, c2);
}
else
{
if (c1 == 1)
{
vec.push_back(true);
favorite_tree.AppendItem(favorite_item, c2);
}
else
vec.push_back(false);
vecSet.push_back(vec);
vec.push_back(c2);
vec.push_back(c3);
vec.push_back(c4);
vec.push_back(wxString::Format("%d", c5));
vec.push_back(wxString::Format("%d", c6));
vec.push_back(wxString::Format("%d", c7));
vec.push_back(wxString::Format("%d", c8));
}
row++;
}
}
else
{
wxMessageDialog* msgDialog = new wxMessageDialog(NULL, "Error! Cannot load data from table.", "Error", wxOK | wxICON_ERROR);
msgDialog->ShowModal();
sqlite3_free(m_ErrMsg);
}
rc = sqlite3_finalize(m_Stmt);
sqlite3_close(m_Database);
}
catch (const std::exception &exception)
{
wxLogDebug(exception.what());
}
return vecSet;
}
所以我想它现在已经修好了。否则(c1==0)
是无效的。至于你的问题,你不想推回哪个向量?如果你指的是vecSet
vector,那么以后可能会出现问题,因为无论向量的实际大小如何(或者在没有实际检查的情况下假设某个固定大小),你都会增加并使用row
。什么给了你一个错误(什么错误?)以及你想要或不想要推回什么?很抱歉,复制粘贴错误,忘记在else
之后删除c1==0
。是的,如果(c9==1),我不想将任何内容推回到vecSet
,但我想trash\u tree.AppendItem(trash\u item,c2)
@Devolus我基本上有2个wxTreeCtrl
一个用于收藏物品,另一个用于垃圾物品if(c1==1)
表示如果项是收藏夹,则返回向量并将该项的文件名c2
附加到favorite_树,如果(c9==1)
表示项被丢弃,则不要推回任何内容,即不要将该项插入wxDataViewListCtrl
,但是将该项目的文件名c2
附加到trash\u tree
中。我编辑了我的原始帖子,很抱歉,我无法正确解释问题,同时尝试不过度扩展我的帖子。你在上面分享的代码给了我同样的错误,我在原始帖子中发布了一个错误截图。你试过了吗?是的,它给出了同样的错误,我在原始帖子中发布了一个错误截图。在评论中也很难说,我在下面发布了另一个答案来展示这些变化。啊,对不起,我错过了。当然,矢量推力必须在之后出现。顺便说一句,声明vec
的第一行可以移动到else
的顶部。
wxVector<wxVector<wxVariant>> Database::LoadDatabase(wxVector<wxVector<wxVariant>>& vecSet, wxTreeCtrl& favorite_tree, wxTreeItemId& favorite_item, wxTreeCtrl& trash_tree, wxTreeItemId& trash_item)
{
try
{
if (sqlite3_open("Samples.db", &m_Database) != SQLITE_OK)
{
wxLogDebug("Error opening DB");
throw sqlite3_errmsg(m_Database);
}
std::string load = "SELECT FAVORITE, FILENAME, SAMPLEPACK, TYPE, \
CHANNELS, LENGTH, SAMPLERATE, BITRATE, TRASHED \
FROM SAMPLES;";
rc = sqlite3_prepare_v2(m_Database, load.c_str(), load.size(), &m_Stmt, NULL);
if (rc == SQLITE_OK)
{
int row = 0;
while (SQLITE_ROW == sqlite3_step(m_Stmt))
{
wxLogDebug("Record found, fetching..");
int c1 = sqlite3_column_int(m_Stmt, 0);
wxString c2 = wxString(std::string(reinterpret_cast< const char* >(sqlite3_column_text(m_Stmt, 1))));
wxString c3 = wxString(std::string(reinterpret_cast< const char* >(sqlite3_column_text(m_Stmt, 2))));
wxString c4 = std::string(reinterpret_cast<const char *>(sqlite3_column_text(m_Stmt, 3)));
int c5 = sqlite3_column_int(m_Stmt, 4);
int c6 = sqlite3_column_int(m_Stmt, 5);
int c7 = sqlite3_column_int(m_Stmt, 6);
int c8 = sqlite3_column_int(m_Stmt, 7);
int c9 = sqlite3_column_int(m_Stmt, 8);
wxVector<wxVariant> vec;
if (c9 == 1)
{
trash_tree.AppendItem(trash_item, c2);
}
else
{
if (c1 == 1)
{
vec.push_back(true);
favorite_tree.AppendItem(favorite_item, c2);
}
else
vec.push_back(false);
vecSet.push_back(vec);
vec.push_back(c2);
vec.push_back(c3);
vec.push_back(c4);
vec.push_back(wxString::Format("%d", c5));
vec.push_back(wxString::Format("%d", c6));
vec.push_back(wxString::Format("%d", c7));
vec.push_back(wxString::Format("%d", c8));
}
row++;
}
}
else
{
wxMessageDialog* msgDialog = new wxMessageDialog(NULL, "Error! Cannot load data from table.", "Error", wxOK | wxICON_ERROR);
msgDialog->ShowModal();
sqlite3_free(m_ErrMsg);
}
rc = sqlite3_finalize(m_Stmt);
sqlite3_close(m_Database);
}
catch (const std::exception &exception)
{
wxLogDebug(exception.what());
}
return vecSet;
}
wxVector<wxVariant> vec;
if (c9 == 1)
{
trash_tree.AppendItem(trash_item, c2);
}
else
{
if (c1 == 1)
{
vec.push_back(true);
favorite_tree.AppendItem(favorite_item, c2);
}
else
vec.push_back(false);
vec.push_back(c2);
vec.push_back(c3);
vec.push_back(c4);
vec.push_back(wxString::Format("%d", c5));
vec.push_back(wxString::Format("%d", c6));
vec.push_back(wxString::Format("%d", c7));
vec.push_back(wxString::Format("%d", c8));
vecSet.push_back(vec);
}