Re[4]: Аналог MFC-шной функции CDialog::OnInitDialog в Qt
От: AlexGin Беларусь  
Дата: 19.09.22 12:05
Оценка: +4
Здравствуйте, Нomunculus, Вы писали:

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


Ну, на мой взгляд следует полагать, что ресурс КЫВТ это своего рода справочник, где можно найти что-то выходящее за рамки просто учебника.
И если был задан вопрос, я бы не говорил, что он интересен только для ТС.
ИМХО, следует понимать, что вопрос может быть интересен многим, хотя его задал только один.

P.S. Всё-таки, хотелось бы (очередной раз) напомнить ТСу — что данный ресурс не заменяет базовую документацию по Qt.
Re[4]: Аналог MFC-шной функции CDialog::OnInitDialog в Qt
От: AlexGin Беларусь  
Дата: 16.09.22 12:25
Оценка: 4 (1) +2
Здравствуйте, Нomunculus, Вы писали:

Н>Я не помню точно, но вроде после конструктора никаких компонент еще нет...


После вызова:
    setupUi(this);

компоненты в конструкторе — уже есть

приведенный выше отрывок:
    QMyDialog  myDialog;
    myDialog.Init(value1, value2, /* ... */ valuen); // n параметров у функции
    myDialog.setModal(true);
    myDialog.exec();


я бы переписал так:
    QMyDialog  myDialog(value1, value2, /* ... */ valuen); // n параметров у конструктора диалога
    myDialog.exec();


Функцию Init() — или убрать (если всё её хозяйство вызывается единожды) и все действия перенести в конструктор,
или же — сделать как член класса QMyDialog и вызывать — из конструктора.

Вызов setModal(true); — избыточен, его можно и нужно убирать —
т.к. вызов myDialog.exec(); — подразумевает модальность диалогового окна.
Отредактировано 16.09.2022 12:32 AlexGin . Предыдущая версия . Еще …
Отредактировано 16.09.2022 12:31 AlexGin . Предыдущая версия .
Отредактировано 16.09.2022 12:29 AlexGin . Предыдущая версия .
Отредактировано 16.09.2022 12:27 AlexGin . Предыдущая версия .
Re: Аналог MFC-шной функции CDialog::OnInitDialog в Qt
От: DiPaolo Россия  
Дата: 15.09.22 06:59
Оценка: +3
RF>В библиотеке MFC в классе CDialog есть функция OnInitDIalog, в которой выполняются действия при открытии диалогового окна.
RF>А есть ли какой-то аналог в библиотеке Qt для этого случая? Как задать диалоговому окну, открываемого в программе (например, после нажатия кнопки) сделать какие-то действия в нём (например, заполнить текстовые поля или таблицы)?

Конструктор.

FindDialog::FindDialog(QWidget *parent)
    : QDialog(parent)
{
    label = new QLabel(tr("Find &what:"));
    lineEdit = new QLineEdit;
    label->setBuddy(lineEdit);

    caseCheckBox = new QCheckBox(tr("Match &case"));
    fromStartCheckBox = new QCheckBox(tr("Search from &start"));
    fromStartCheckBox->setChecked(true);

    findButton = new QPushButton(tr("&Find"));
    findButton->setDefault(true);

    moreButton = new QPushButton(tr("&More"));
    moreButton->setCheckable(true);


Подробнее тут https://doc.qt.io/qt-6/qtwidgets-dialogs-extension-example.html
Патриот здравого смысла
Re[3]: Аналог MFC-шной функции CDialog::OnInitDialog в Qt
От: Нomunculus Россия  
Дата: 19.09.22 07:19
Оценка: +1 :))
Здравствуйте, Igore, Вы писали:

Я понимаю что хаки с таймером позволяют обойти некоторые баги и кривизны архитектуры. Но не надо про это рассказывать тому, кто в хидер либы не научился даже заглядывать
Re[2]: Аналог MFC-шной функции CDialog::OnInitDialog в Qt
От: K13 http://akvis.com
Дата: 15.09.22 10:29
Оценка: +2
AG>В конце конструктора моего виджета (диалога или главного окна) добавляю:
AG>
AG>    QTimer::singleShot(200, this, SLOT(OnTimerSingleShot())); // Инициализация - отложенная на 200 ms
AG>


обычно можно указать 0 вместо времени, тогда событие на вызов слота просто ставится в конец очереди.
чаще всего этого хватает, можно дергать QTimer::singleShot например в showEvent если хочется запускать инициализацию только когда окно точно показывается (бывает, окна создаются но скрыты).

ну и давно уже вместо SLOT() можно сразу написать лямбду, что именно сделать.
Re: Аналог MFC-шной функции CDialog::OnInitDialog в Qt
От: Нomunculus Россия  
Дата: 15.09.22 10:32
Оценка: 4 (1)
Здравствуйте, RussianFellow, Вы писали:

Обычно ты диалог вызываешь напрямую в коде. Имеет смысл создать специальную функцию Init, можно с параметрами, и вызывать ее вручную там где создаешь диалог. Запускать таймер в конструкторе — ну такое себе.
Аналог MFC-шной функции CDialog::OnInitDialog в Qt
От: RussianFellow Россия http://russianfellow.livejournal.com
Дата: 15.09.22 06:55
Оценка:
В библиотеке MFC в классе CDialog есть функция OnInitDIalog, в которой выполняются действия при открытии диалогового окна.
А есть ли какой-то аналог в библиотеке Qt для этого случая? Как задать диалоговому окну, открываемого в программе (например, после нажатия кнопки) сделать какие-то действия в нём (например, заполнить текстовые поля или таблицы)?
1613 г. = 2024 г.
Re: Аналог MFC-шной функции CDialog::OnInitDialog в Qt
От: AlexGin Беларусь  
Дата: 15.09.22 08:01
Оценка:
Здравствуйте, 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();
}

Такое требуется достаточно редко, но иногда это может оказаться полезно.
Отредактировано 15.09.2022 8:04 AlexGin . Предыдущая версия .
Re[2]: Аналог MFC-шной функции CDialog::OnInitDialog в Qt
От: RussianFellow Россия http://russianfellow.livejournal.com
Дата: 15.09.22 11:30
Оценка:
Здравствуйте, Нomunculus, Вы писали:

Н>Здравствуйте, RussianFellow, Вы писали:


Н>Обычно ты диалог вызываешь напрямую в коде. Имеет смысл создать специальную функцию Init, можно с параметрами, и вызывать ее вручную там где создаешь диалог. Запускать таймер в конструкторе — ну такое себе.


Ну то есть если вызывается диалог:

QMyDialog  myDialog;
myDialog.Init(value1, value2, /* ... */ valuen); // n параметров у функции
myDialog.setModal(true);
myDialog.exec();


то в функции QMyDialog::Init я вывожу данные в компоненты диалога на основе значений value1, value2, ..., valuen ?
1613 г. = 2024 г.
Re[3]: Аналог MFC-шной функции CDialog::OnInitDialog в Qt
От: Нomunculus Россия  
Дата: 15.09.22 11:32
Оценка:
Здравствуйте, RussianFellow, Вы писали:

RF>то в функции QMyDialog::Init я вывожу данные в компоненты диалога на основе значений value1, value2, ..., valuen ?


Я не помню точно, но вроде после конструктора никаких компонент еще нет и не сможешь их заполнить, но сможешь где-то сохранить. Хотя, могу ошибаться, надо проверить. C Qt пару лет назад работал посдедний раз.

В генерируемом moc файле констуктора даилога глянь — там создаются компоненты или нет. Если в коснтуркторе, то да, в Init можно их заполнять
Отредактировано 15.09.2022 11:39 Нomunculus . Предыдущая версия .
Re[3]: Аналог MFC-шной функции CDialog::OnInitDialog в Qt
От: AlexGin Беларусь  
Дата: 16.09.22 10:18
Оценка:
Здравствуйте, K13, Вы писали:

K13>обычно можно указать 0 вместо времени, тогда событие на вызов слота просто ставится в конец очереди.

K13>чаще всего этого хватает, можно дергать QTimer::singleShot например в showEvent если хочется запускать инициализацию только когда окно точно показывается (бывает, окна создаются но скрыты).

K13>ну и давно уже вместо SLOT() можно сразу написать лямбду, что именно сделать.


Я в курсе как первого, так и второго примечания к моему посту, спасибо за данное напоминание.
В этом случае — просто хотел показать суть: как сделать отложенную инициализацию.
Re[2]: Аналог MFC-шной функции CDialog::OnInitDialog в Qt
От: AlexGin Беларусь  
Дата: 16.09.22 10:30
Оценка:
Здравствуйте, Нomunculus, Вы писали:

Н>Обычно ты диалог вызываешь напрямую в коде. Имеет смысл создать специальную функцию Init, можно с параметрами, и вызывать ее вручную там где создаешь диалог. Запускать таймер в конструкторе — ну такое себе.


Да, применение отложенной инициализации по таймеру — это не правило, а скорее один из вариантов обойти проблему:
Например — диалог коннектиться к удаленному серверу, есть немалая вероятнось того, что тот сервер/линия окажется в нерабочем состоянии.
Что тогда?
Конструктор — не возврашает значения, значит — бросать исключение ...но это совсем не то, что требуется!
Тогда уже правильнее — показать диалог, и отобразить факт (а возможно и причину) ошибки.
Отредактировано 16.09.2022 12:10 AlexGin . Предыдущая версия .
Re[5]: Аналог MFC-шной функции CDialog::OnInitDialog в Qt
От: Нomunculus Россия  
Дата: 16.09.22 13:43
Оценка:
Здравствуйте, AlexGin, Вы писали:


AG>После вызова:

AG>
AG>    setupUi(this);
AG>

AG>компоненты в конструкторе — уже есть

А, ну да, хорошо. Подзабыл уж.
А ТС неплохо бы научиться в хидеры либ заглядывать и в генерируемый код — большинство вопросов само пропадет. Раз уж с MFC этого не понял — так может с Qt поймет
Re[2]: Аналог MFC-шной функции CDialog::OnInitDialog в Qt
От: Igore Россия  
Дата: 19.09.22 07:17
Оценка:
Здравствуйте, Нomunculus, Вы писали:

Н>Обычно ты диалог вызываешь напрямую в коде. Имеет смысл создать специальную функцию Init, можно с параметрами, и вызывать ее вручную там где создаешь диалог. Запускать таймер в конструкторе — ну такое себе.

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