首页 > 解决方案 > wxWidgets - 如何不将任何内容推回 wxVector?

问题描述

我有一个应用程序,用户可以在其中插入文件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;
}

我想要做的是,什么时候c9 == 1不要将任何东西推回向量。但是如果我不推回向量,即注释else if语句中的所有行,除非trash_tree.AppendItem(trash_item, c2);它给我关于索引的错误。

编辑:我称之为LoadDatabase()

void Browser::RestoreDatabase()
{
    try
    {
        wxVector<wxVector<wxVariant>> dataset;

        if (db.LoadDatabase(dataset, *m_CollectionView, rootNode, *m_TrashedItems, trash_root_node).empty())
        {
            wxLogDebug("Error! Database is empty.");
        }
        else
        {
            for (auto data : dataset)
            {
                m_SampleListView->AppendItem(data);
            }
        }
    }
    catch (...)
    {
        std::cerr << "Error loading data." << std::endl;
    }
}

SampleListView这里是wxDataViewListCtrl,我希望当c9 == 1不返回任何内容时,只需将该项目的文件名附加到trash_tree. 因为如果我推回任何内容,vec它将被添加到SampleListView.

这是我得到的错误, 在此处输入图像描述

标签: c++wxwidgets

解决方案


不确定我是否理解您的问题,但您的意思是这样吗?

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));
}

推荐阅读