Как заставить другие виджеты реагировать на действия над одноуровневым элементом в wxWidgets (C++)?C++

Программы на C++. Форум разработчиков
Ответить
Anonymous
 Как заставить другие виджеты реагировать на действия над одноуровневым элементом в wxWidgets (C++)?

Сообщение Anonymous »

Я пытаюсь создать графический интерфейс с wxWidgets на C++, где пользователь может дважды щелкнуть главную панель, чтобы добавлять и удалять круги. Когда пользователь один раз нажимает на один из этих кругов, я хочу, чтобы он переключил isSelected и изменил его внешний вид, а также снял выделение со всех остальных кругов и изменил их внешний вид.
Для этого я создал собственный виджет, наследующий wxWindow, для управления внешним видом. Я могу заставить его работать: нажатие на элемент CustomWidgetCircle сделает его выбранным, а нажатие на фоновую панель WidgetPanel отменит все выделение, но я не могу понять, как получить WidgetPanel< /code>, чтобы ответить и изменить свои дочерние данные, щелкнув CustomWidgetCircle.
Выдержки кода ниже. Прямо сейчас динамические привязки происходят в соответствующих конструкторах.

Код: Выделить всё

// CustomWidgetCircle.h
class CustomWidgetCircle : public wxWindow {
public:
CustomWidgetCircle(wxPanel* parent, wxString label, wxPoint location);
bool isSelected = false;
private:
void OnMouseDown(wxMouseEvent& event);
void OnPaintEvent(wxPaintEvent& event);
void Render(wxDC& dc);
};

Код: Выделить всё

// CustomWidgetCircle.cpp

...
CustomWidgetCircle

CustomWidgetCircle::OnMouseDown(wxMouseEvent& event) {
this->isSelected = !this->isSelected;
Refresh();
}
...

Код: Выделить всё

// WidgetPanel.h
class WidgetPanel : public wxPanel {
public:
WidgetPanel(wxFrame* parent);
private:
void OnDoubleClick(wxMouseEvent& event);
void OnMouseDown
std::list CustomWidgetCircleList;
};

Код: Выделить всё

// WidgetPanel.cpp
...
WidgetPanel::OnDoubleClick(wxMouseEvent& event) {
CustomWidgetCircle* newCircle = new CustomWidgetCircle(this, "lbl", event.GetPosition());
CustomWidgetCircleList.push_back(newCircle);
Refresh();
}

WidgetPanel::OnMouseDown(wxMouseEvent& event) {
for (auto circle_ptr : CustomWidgetCircleList) {
circle_ptr->isSelected = false;
}
Refresh();
}
...
Что я пробовал:
  • Использование Skip() при вызове OnMouseDown
    Что я пробовал:

    Использование Skip() при вызове OnMouseDown в дочерних окнах, чтобы передать событие родительскому. Кажется, ничего не делает.
  • Только привязка обработчика OnMouseDown к родительскому фрейму и вызов GetEventObject() для аргумента события, чтобы изменить дочернее окно, которое на него нажали, но это не сработает, поскольку возвращает wxObject, поэтому я не могу получить доступ к методам/данным-членам моего пользовательского класса.
  • Вызов OnMouseDown обработчик родителя из дочернего окна, но я не могу понять, как сделать родительские методы доступными из дочернего окна.
  • Подкласс wxCommandEvent, чтобы я мог передать распространяющееся событие вверх по иерархии окон. Я не думаю, что еще разобрался с тем, как правильно определять и инициализировать пользовательские события.
Признаюсь, мне многое не хватает в том, как обработка событий работает, но я уже несколько раз просматривал документацию и не стал ближе. Если что-то из вышеперечисленного может сработать, но мне не хватает некоторых деталей, пожалуйста, дайте мне знать. Я могу предоставить больше кода, чтобы его можно было воспроизвести, но это не ошибка как таковая. Заранее спасибо.

Подробнее здесь: https://stackoverflow.com/questions/786 ... xwidgets-c
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C++»