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

wxWidgets: Правильное создание пользовательского элемента управления, который содержит внутри себя другие элементы управления.

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

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

Но проблемы у меня

  • если я производный от wxPanel, макет элемента управления работает так, как я ожидаю (он расширяется в сайзере, чтобы соответствовать дочерним элементам управления), однако ни один из дочерних элементов не получает никаких событий (например, EVT_LEFT_DOWN и т. д.). Я попытался подключить событие для основного элемента управления, который запускает event.Skip(), но это не помогло.

  • Если вместо этого я изменю свой класс, чтобы он производился от wxControl (или wxFrame, или, возможно, от ряда других, которые я пробовал), дочерние элементы управления делают получать события, но все это не расширяется в сайзере. он расположен внутри, он просто рисуется как крошечная коробка (около 10-20 квадратных пикселей), хотя дочерние элементы управления занимают гораздо больше места.

Любые идеи?

Обновление:

mangoMixerStrip.cpp

mangoMixerStrip::mangoMixerStrip(wxFrame* parent, HostChannel* channel) : wxPanel(parent)
{
    myChannel = channel;
    SetBackgroundColour(wxColour(172,81,90));

    wxBoxSizer* s = new wxBoxSizer(wxVERTICAL);

    // some custom controls i made which all work fine when added like any other control, derived from wxPanel also
    faderPan = new mangoFader(parent, 200, false, 55);
    faderGain = new mangoFader(parent, 200, true, 126);    
    buttonSolo = new mangoButton(parent, false, ButtonGraphic::Solo);

    s->Add(faderPan);
    s->Add(buttonSolo);
    s->Add(faderGain);

    this->SetSizer(s);

    this->Connect(wxEVT_LEFT_DOWN, wxMouseEventHandler(mangoMixerStrip::mouseDown)); // this function simply contains event.Skip()
}

в моем основном wxFrame

mangoFrameMain::mangoFrameMain(wxWindow* parent) : FrameMain( parent )
{   
    HostChannel* h =  new HostChannel();
    h->setName("what up"); // these 2 lines unrelated to the UI

    mangoMixerStrip *test = new mangoMixerStrip(this, h);
    this->GetSizer()->Add(test, 1, wxFIXED_MINSIZE, 0);
}

И чтобы уточнить: сам экземпляр mangoMixerStrip получает любые события, которые я к нему подключаю, но его дочерние элементы управления не получают.

03.07.2011

  • Наследование от wxPanel — правильный путь. Странно, что ваши элементы управления не получают события. Пожалуйста, опубликуйте свой код, чтобы мы могли видеть, что происходит. 03.07.2011

Ответы:


1

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

   faderPan = new mangoFader(parent, 200, false, 55);

должно быть

  faderPan = new mangoFader(this, 200, false, 55);
03.07.2011

2

Если вы хотите использовать wxFrame, вы также можете это сделать. Однако вы должны убедиться, что после создания фрейма вы добавляете размер к фрейму, затем панель, а затем еще один размер. Затем вы можете поместить все, что хотите, в размерчик. По какой-то причине wxwidgets не будет иметь нужного размера, если вы не поместите размер, затем панель, затем размер.

07.07.2011
  • Вау! Звучит как сложный способ сделать то, что должно быть простым! 07.07.2011
  • Новые материалы

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

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

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

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

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

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

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