1

Тема: Питання щодо wxWidgets

Намагався вирівняти кнопку по правому краю при використанні GridBagSizer:

general_grid_bag_sizer->Add(OK_button, wxGBPosition(1, 0), wxALIGN_RIGHT);

error: no matching member function for call to 'Add'

wxALIGN_RIGHT чомусь не працює тут, хоча мав би, бо начебто успадкований від спільного класу Sizer.
Чому не працює?

2

Re: Питання щодо wxWidgets

Щось мені підказує, що це не всі помилки, які вам видав компілятор

Vitaliy_Danmer написав:
error: no matching member function for call to 'Add'

Надавайте помилки повністю, так буде простіше.

Vitaliy_Danmer написав:

wxALIGN_RIGHT чомусь не працює тут, хоча мав би, бо начебто успадкований від спільного класу Sizer.
Чому не працює?

Підозрюю проблема у дефолтних параметрах функції Add. Їх не можна пропускати. Якщо я все вірно розумію, то мало б бути:

general_grid_bag_sizer->Add(OK_button, wxGBPosition(1, 0), wxDefaultSpan, wxALIGN_RIGHT);

Відповідно до ф-ї

Add(wxWindow *window, const wxGBPosition &pos, const wxGBSpan &span=wxDefaultSpan, int flag=0, int border=0, wxObject *userData=NULL)

Подякували: Teg Miles, leofun012

3

Re: Питання щодо wxWidgets

wander написав:

Щось мені підказує, що це не всі помилки, які вам видав компілятор

Vitaliy_Danmer написав:
error: no matching member function for call to 'Add'

Надавайте помилки повністю, так буде простіше.

Vitaliy_Danmer написав:

wxALIGN_RIGHT чомусь не працює тут, хоча мав би, бо начебто успадкований від спільного класу Sizer.
Чому не працює?

Підозрюю проблема у дефолтних параметрах функції Add. Їх не можна пропускати. Якщо я все вірно розумію, то мало б бути:

general_grid_bag_sizer->Add(OK_button, wxGBPosition(1, 0), wxDefaultSpan, wxALIGN_RIGHT);

Відповідно до ф-ї

Add(wxWindow *window, const wxGBPosition &pos, const wxGBSpan &span=wxDefaultSpan, int flag=0, int border=0, wxObject *userData=NULL)

Так, справа була в пропущеному wxDefaultSpan.

4

Re: Питання щодо wxWidgets

Чи існує для wxDialog функція авторозширювання під наявний вміст?
Наприклад, створюється wxDialog, додається панель і sizer панелі, а далі вміст(кнопки, Notebook і т.д.).
Якщо в параметрах wxDialog лишити wxDefaultSize,
то зрештою вікно wxDialog буде менше вмісту.
Чи можна це автоматично якось регулювати?

5

Re: Питання щодо wxWidgets

Vitaliy_Danmer написав:

.. для wxDialog функція авторозширювання під наявний вміст ..

Див.wxDialogLayoutAdapter, або всякі туторіали.

Luke's Dev Tutorials - Додай повзунки до твого елемента керування C++ (видиво, en)

6

Re: Питання щодо wxWidgets

leofun01 написав:
Vitaliy_Danmer написав:

.. для wxDialog функція авторозширювання під наявний вміст ..

Див.wxDialogLayoutAdapter, або всякі туторіали.

Luke's Dev Tutorials - Додай повзунки до твого елемента керування C++ (видиво, en)

В туторіалах я знайшов лише про адаптацію до маленьких екранів і додавання скроллбарів.
Саме це і робить wxDialogLayoutAdapter. А мені навпаки треба,
щоб вікно розтягувалося під вміст, а не просто додавало скроллбарів.

7

Re: Питання щодо wxWidgets

Vitaliy_Danmer написав:

.. знайшов лише про адаптацію до маленьких екранів і додавання скроллбарів.
Саме це і робить wxDialogLayoutAdapter. А мені навпаки треба,
щоб вікно розтягувалося під вміст, а не просто додавало скроллбарів.

Ем .. то так не робиться. Технічно ти можеш обмежити мінімальний розмір вікна (див.SetMinSize(w, h)), але не варто так робити.

8 Востаннє редагувалося Teg Miles (28.08.2023 14:44:38)

Re: Питання щодо wxWidgets

Чому, коли я роблю ось так:

MyApp::~MyApp()
{
    delete m_locale;
    m_locale {nullptr};
}

то такий код не працює. Вимагає «;» після виразу.

А якщо зробити так:

MyApp::~MyApp()
{
    delete m_locale;
    m_locale = nullptr;
}

то все працює добре без помилок.
m_locale — це ось такий вказівник wxLocale* m_locale.
І чи варто в деструкторі взагалі робити його вказівником на нуль,
чи краще просто лишити лише delete?

9 Востаннє редагувалося koala (28.08.2023 15:06:01)

Re: Питання щодо wxWidgets

Бо перший вираз некоректний, а другий - коректний.

Vitaliy_Danmer написав:
m_locale {nullptr};

А що ви взагалі намагаєтеся тут зробити? От як, на вашу думку, це має працювати?

Vitaliy_Danmer написав:

І чи варто в деструкторі взагалі робити його вказівником на нуль, чи краще просто лишити лише delete?

У деструкторі можна не зануляти, все одно змінну m_locale (не ту, на яку вона посилається, а саму її) буде звільнено.

Подякували: Teg Miles1

10 Востаннє редагувалося Teg Miles (28.08.2023 15:10:43)

Re: Питання щодо wxWidgets

koala написав:

Бо перший вираз некоректний, а другий - коректний.

Vitaliy_Danmer написав:
m_locale {nullptr};

А що ви взагалі намагаєтеся тут зробити? От як, на вашу думку, це має працювати?

Я читав, що запис «{}» рівнозначний знаку «=».
Це уніформна ініціалізація, що з'явилася в С++11.

Наприклад, коли я оголошую в класі змінну wxMenu* filemenu {nullptr}; ,
то все працює чудово. А деструктор чомусь не сприймає такий запис.

11 Востаннє редагувалося wander (28.08.2023 15:13:06)

Re: Питання щодо wxWidgets

Vitaliy_Danmer написав:

то такий код не працює. Вимагає «;» після виразу.

Бо ось це T object{arg1, arg2, ...} - це форма ініціалізації. Тобто присвоєння значення змінній вперше на місці (in-place).

int a{1}; // ініціалізація
int b = 2; // ініціалізація
a = b; // присвоєння

Ініціалізувати об'єкт вдруге не можна, а присвоїти (скопіювати) можна, це так, на хлопський розум.

Vitaliy_Danmer написав:

Я читав, що запис «{}» рівнозначно знаку «=».
Це уніформна ініціалізація, що з'явилася в C++11.

Все вірно, чим ініціалізація від присвоєння відрізняється, ви знаєте?

Vitaliy_Danmer написав:

І чи варто в деструкторі взагалі робити його вказівником на нуль

Ні, не варто.

P.S. Одне питання - одна тема.

Подякували: Teg Miles, koala, leofun013