Информация об изменениях

Сообщение Re: Аналог MFC-шной функции CDialog::OnInitDialog в Qt от 15.09.2022 8:01

Изменено 15.09.2022 8:04 AlexGin

Re: Аналог MFC-шной функции CDialog::OnInitDialog в Qt
Здравствуйте, RussianFellow, Вы писали:

RF>В библиотеке MFC в классе CDialog есть функция OnInitDIalog, в которой выполняются действия при открытии диалогового окна.

RF>А есть ли какой-то аналог в библиотеке Qt для этого случая? Как задать диалоговому окну, открываемого в программе (например, после нажатия кнопки) сделать какие-то действия в нём (например, заполнить текстовые поля или таблицы)?

Функция OnInitDIalog в MFC — от того, что применяя C++ в технологиях MFC и WinAPI, требуется разнести два отдельных момента:
1) Создание объекта заданного C++ класса;
2) Непосредственное создание графического окна (как объекта в понятиях Windows и WinAPI).

Для Qt — всё делается по современному: в конструкторе объекта C++ класса (наследника QWidget) следует делать всё необходимое.
Делать всё то, что в рамках MFC выносилось на OnInitDIalog.

P.S. В то же время, бывают (относительно редкие) случаи, когда именно требуется разделить конструктор и инициализацию.
В этом случае я использую отложенную инициализацию по таймеру:
Делаю слот — в заголовочнике:
private slots:
    void OnTimerSingleShot();


В конце конструктора моего виджета (диалога или главного окна) добавляю:
    QTimer::singleShot(200, this, SLOT(OnTimerSingleShot())); // Инициализация - отложенная на 200 ms


Ну и реализую эту самую отложенную инициализацию:
void MyDlg::OnTimerSingleShot()
{
    // в качестве примера:
    ConnectToDataBase();
    RefreshUiTree();
}
Re: Аналог MFC-шной функции CDialog::OnInitDialog в Qt
Здравствуйте, RussianFellow, Вы писали:

RF>В библиотеке MFC в классе CDialog есть функция OnInitDIalog, в которой выполняются действия при открытии диалогового окна.

RF>А есть ли какой-то аналог в библиотеке Qt для этого случая? Как задать диалоговому окну, открываемого в программе (например, после нажатия кнопки) сделать какие-то действия в нём (например, заполнить текстовые поля или таблицы)?

Функция OnInitDIalog в MFC — от того, что применяя C++ в технологиях MFC и WinAPI, требуется разнести два отдельных момента:
1) Создание объекта заданного C++ класса;
2) Непосредственное создание графического окна (как объекта в понятиях Windows и WinAPI).

Для Qt — всё делается по современному: в конструкторе объекта C++ класса (наследника QWidget) следует делать всё необходимое.
Делать всё то, что в рамках MFC выносилось на OnInitDIalog.

P.S. В то же время, бывают (относительно редкие) случаи, когда именно требуется разделить конструктор и инициализацию.
В этом случае я использую отложенную инициализацию по таймеру:
Делаю слот — в заголовочнике:
private slots:
    void OnTimerSingleShot();


В конце конструктора моего виджета (диалога или главного окна) добавляю:
    QTimer::singleShot(200, this, SLOT(OnTimerSingleShot())); // Инициализация - отложенная на 200 ms


Ну и реализую эту самую отложенную инициализацию:
void MyDlg::OnTimerSingleShot()
{
    // в качестве примера:
    ConnectToDataBase();
    RefreshUiTree();
}

Такое требуется достаточно редко, но иногда это может оказаться полезно.