#c #wxwidgets
#c #wxwidgets
Вопрос:
У меня есть wxDataViewListCtrl
, который я привязываю, когда элемент щелкает как,
Bind(wxEVT_DATAVIEW_SELECTION_CHANGED, amp;Browser::OnClickSampleView, this, BCID_SampleListView);
И связанная функция,
void Browser::OnClickSampleView(wxDataViewEventamp; event)
{
std::cout << "n Click Sample View n";
std::string selection = SampleListView->GetTextValue(SampleListView->GetSelectedRow(), 1).ToStdString();
std::cout << selection << "n";
}
Но ничего не происходит, когда я нажимаю на элемент, ничего не выводится на консоль без ошибок. Что я делаю не так?
Я уже пытался привязать его без идентификатора, а SampleListView->Bind()
также, не повезло.
Я задал этот вопрос на форуме wxWidgets, но никто там не смог разобраться в проблеме, один человек попросил меня попробовать это,
SampleListView->Bind(wxEVT_DATAVIEW_SELECTION_CHANGED, [this](wxDataViewEvent amp;e) {
wxLogDebug("dataviewevent row %d", SampleListView->ItemToRow(e.GetItem()));
});
и это работает, он отлично выводится на консоль,
18:07:06: Debug: dataviewevent row 0
18:07:07: Debug: dataviewevent row 1
18:07:09: Debug: dataviewevent row 2
18:07:10: Debug: dataviewevent row 3
Ссылка на проект, в строке которого есть Bind()
— https://gitlab.com/apoorv569/cpp-projects/-/blob/master/wxWidgets/SampleBrowser/src/Browser.cpp#L142
Редактировать:
Немного поэкспериментировав с приложением, я заметил, что все кнопки и все, для чего я перехватываю событие, перестают работать после добавления одной записи в wxDataViewListCtrl, поэтому я продолжил исследование и в функции, которую я использую для добавления данных в wxDataViewListCtrl, я вставляю все эти данные в базу данных Sqlite3кроме того, я заметил, что если я прокомментирую эту строку, которая вставляет данные в базу данных Sqlite3, все работает нормально.
void Browser::OnClickDirCtrl(wxCommandEventamp; 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::string Path = DirCtrl->GetFilePath().ToStdString();
char c = '/';
std::string Filename = DirCtrl->GetFilePath().AfterLast(c).ToStdString();
wxVector<wxVariant> Data;
Data.clear();
Data.push_back(false);
Data.push_back(Filename);
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));
SampleListView->AppendItem(Data);
// db.InsertSample(0, Filename, Artist.to8Bit(), Channels, Length,
// SampleRate, Bitrate, Comment.to8Bit(), Path);
wxString sample = db.GetSamplePathByFilename(std::string(Filename));
std::cout << "Sample: " << sample << std::endl;
}
Как вы можете видеть выше, я прокомментировал строку, которая вставляет данные в базу данных Sqlite3 db.InsertSample()
, которая выглядит следующим образом
void Database::InsertSample(int Favorite, std::string Filename,
std::string SamplePack, int Channels, int Length,
int SampleRate, int Bitrate, std::string Comment,
std::string Path)
{
try
{
rc = sqlite3_open("Samples.db", amp;DB);
sql = "INSERT INTO SAMPLES (FAVORITE, FILENAME, SAMPLEPACK, CHANNELS,
LENGTH, SAMPLERATE, BITRATE, BITSPERSAMPLE, PATH)
VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?);";
rc = sqlite3_prepare_v2(DB, sql.c_str(), sql.size(), amp;stmt, NULL); // create the prepared statement
rc = sqlite3_bind_int(stmt, 1, Favorite);
rc = sqlite3_bind_text(stmt, 2, Filename.c_str(), Filename.size(), SQLITE_STATIC);
rc = sqlite3_bind_text(stmt, 3, SamplePack.c_str(), SamplePack.size(), SQLITE_STATIC);
rc = sqlite3_bind_int(stmt, 4, Channels);
rc = sqlite3_bind_int(stmt, 5, Length);
rc = sqlite3_bind_int(stmt, 6, SampleRate);
rc = sqlite3_bind_int(stmt, 7, Bitrate);
rc = sqlite3_bind_text(stmt, 8, Comment.c_str(), Comment.size(), SQLITE_STATIC);
rc = sqlite3_bind_text(stmt, 9, Path.c_str(), Path.size(), SQLITE_STATIC);
if (sqlite3_step(stmt) != SQLITE_DONE)
{
std::cout << "Not inserted data." << "n";
}
rc = sqlite3_finalize(stmt);
if (rc != SQLITE_OK)
{
std::cerr << "Error! Cannot insert data into table." << std::endl;
sqlite3_free(ErrorMessage);
}
else if (rc == SQLITE_BUSY)
{
std::cout << "BUSY" << std::endl;
}
else if (rc == SQLITE_DONE)
{
std::cout << "DONE" << std::endl;
}
else if (rc == SQLITE_ERROR)
{
std::cout << "ERROR" << std::endl;
}
else if (rc == SQLITE_MISUSE)
{
std::cout << "MISUSE" << std::endl;
}
else
{
std::cout << "Data inserted successfully." << ErrorMessage << std::endl;
}
sqlite3_close(DB);
}
catch (const std::exception amp;exception)
{
std::cerr << exception.what();
}
}
Я не могу сказать, что-то не так с базой данных или что на данный момент, я все еще ищу, пожалуйста, если вы видите что-то не так, дайте мне знать.
Ссылка на Database.cpp
файл — https://gitlab.com/apoorv569/cpp-projects/-/blob/master/wxWidgets/SampleBrowser/src/Database.cpp
Комментарии:
1. Это слишком «волшебно» и «невозможно», чтобы его можно было объяснить, не имея возможности воспроизвести его, поэтому вам нужно либо предоставить простейший возможный тестовый пример, показывающий проблему, либо использовать отладчик, чтобы определить, что происходит самостоятельно.
2.Вот минимальный пример, который я сделал, он делает то же самое,
wxDVC
иSqlite3
InsertData()
копируются и изменяются для проверки проблемы. Затем вы можете запуститьmeson build
meson compile -C build
и запустить двоичный./build/wxDvcTest
файл. Это работает в Linux, не могу сказать о Windows или Mac, — drive.google.com/file/d/1vzzlawgYJhVfaLk5sPWJsP4Q2r1CIqDx /…3. Похоже, все работает так, как задумано, просто
std::cout
операторы перестали выводиться на консоль, я не сбрасывал поток после некоторых операторов печати, но даже после добавленияstd::endl
проблема не устранена, поэтому на данный момент я переключил все операторы печати наwxLog
. Так что я думаю, что это исправлено.