Nano Hash - криптовалюты, майнинг, программирование

Как перемещать элемент вверх и вниз в wxListCtrl (wxwidgets)

Это должно быть довольно легко, но у меня чертовски много времени на это. В основном я хочу переместить строку в моем wxListCtrl вверх или вниз. Я разместил это на форуме wxwidgets и получил следующий код.

m_list->Freeze(); 
wxListItem item; 
item.SetId(item_id); // the one which is selected 
m_list->GetItem(item); // Retrieve the item 
m_list->DeleteItem(item_id); // Remove it 
item.SetId(item_id - 1); // Move it up 
m_list->SetItem(item); // Apply it's new pos in the list 
m_list->Thaw();

что не работает. Элемент удаляется, но не перемещается вверх (наверное, строка setitem не работает). Затем я подумал просто переключить текст и изображение, но я даже не могу надежно получить текст из строки. у меня есть

int index = m_right->GetNextItem(-1, wxLIST_NEXT_ALL, wxLIST_STATE_SELECTED);
wxString label = m_right->GetItemText(index);

if(index == 0)
  return;

wxListItem item; 
item.SetId(index); 
bool success = m_right->GetItem(item); 
wxString text = item.GetText();

но текст пустой, хотя текст есть и индекс правильный. Итак, я застрял, даже не в состоянии выполнить самую простую задачу. Кто-нибудь знает, как это сделать? Код запускается в обратном вызове кнопки (пользователь нажимает небольшую стрелку вверх, и мой код выполняется, чтобы попытаться переместить ее). Я использую 2.9.1 на окнах.

10.11.2010

Ответы:


1

Список упорядочен? если это автоматический заказ, он может игнорировать заказ, который вы пытаетесь применить.

Насколько я помню, внутренний порядок не обязательно был последовательным, вам, возможно, придется получить индекс предыдущего элемента и перейти на один перед ним.

10.11.2010

2

Я заставил это работать с wxWidgets 2.9.3 следующим образом:

void FileSelectionPanel::OnMoveUp( wxCommandEvent& WXUNUSED(evt) )
{
    int idx = _listCtrl->GetNextItem( -1, wxLIST_NEXT_ALL, wxLIST_STATE_SELECTED );
    if( idx == 0) idx = _listCtrl->GetNextItem( 0, wxLIST_NEXT_ALL, wxLIST_STATE_SELECTED );

    _listCtrl->Freeze();
    while( idx > -1 ) {    
        wxListItem item;
        item.SetId(idx); _listCtrl->GetItem(item);
        item.SetId(idx-1); _listCtrl->InsertItem(item);

        _listCtrl->SetItemData( idx-1, _listCtrl->GetItemData( idx+1 ));
        for( int i = 0; i < _listCtrl->GetColumnCount(); i++ ) {
            _listCtrl->SetItem( idx-1, i, _listCtrl->GetItemText( idx+1, i ));
        }
        _listCtrl->DeleteItem( idx + 1 );
        idx = _listCtrl->GetNextItem( idx-1, wxLIST_NEXT_ALL, wxLIST_STATE_SELECTED );
    }
    _listCtrl->Thaw();
}

Я заметил, что wxListItem является скорее удобной структурой для хранения состояния представления и помогает "красиво" передавать значения в wxListCtrl. Он никоим образом не связан с тем, что на самом деле находится внутри wxListCtrl.

Надеюсь, это все еще помогает кому-нибудь!

23.01.2012

3

Даже есть уже проверенный ответ. У меня та же проблема, но мой список неупорядочен. Изучив код wxWidgets, я обнаружил, что внутри объекта wxListItem содержится еще одна важная информация — маска. Я добился правильной работы переупорядочения, установив значение маски равным -1, что означает, что все данные должны быть скопированы. Это включает в себя текст элемента, а также другую информацию, например данные элемента (что было важно в моем случае).

wxListItem item;
item.SetId(item_id);         // set needed id
item.SetMask(-1);            // set needed data
m_list->GetItem(item);       // actually retrieve the item
m_list->DeleteItem(item_id); // remove old copy
item.SetId(item_id - 1);     // move item up
m_list->InsertItem(item);    // insert copy of item

Мне также пришлось использовать «InsertItem» вместо «SetItem». В противном случае новый элемент не был вставлен, а существующий был перезаписан (см. также ответ tomcat31).

02.07.2012
Новые материалы

Кластеризация: более глубокий взгляд
Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

Как написать эффективное резюме
Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

Частный метод Python: улучшение инкапсуляции и безопасности
Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

Как я автоматизирую тестирование с помощью Jest
Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

Понимание расстояния Вассерштейна: мощная метрика в машинном обучении
В обширной области машинного обучения часто возникает необходимость сравнивать и измерять различия между распределениями вероятностей. Традиционные метрики расстояния, такие как евклидово..

Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..