Russian Qt Forum

Qt => Пользовательский интерфейс (GUI) => Тема начата: CroCIV от Ноябрь 26, 2009, 12:02



Название: QDialog получить указатели на дочерние виджеты, в частности на кнопки Ок/Отмена
Отправлено: CroCIV от Ноябрь 26, 2009, 12:02
Как это делается  ??? Хотелось бы скрыть конпку отмены в экземпляре класса QFileDialog, наследнике класса QDialog... не хочу свой сохранятор файлов писать из-за такого пустяка  ::)


Название: Re: QDialog получить указатели на дочерние виджеты, в частности на кнопки Ок/Отмена
Отправлено: spectre71 от Ноябрь 26, 2009, 12:07
Как это делается  ??? Хотелось бы скрыть конпку отмены в экземпляре класса QFileDialog, наследнике класса QDialog... не хочу свой сохранятор файлов писать из-за такого пустяка  ::)

Не могу себе представить задачу в которой это может требоваться.


Название: Re: QDialog получить указатели на дочерние виджеты, в частности на кнопки Ок/Отмена
Отправлено: CroCIV от Ноябрь 26, 2009, 13:15
сделал визард, последняя страница которого посвящена теме сохранения сделанных манипуляций


Название: Re: QDialog получить указатели на дочерние виджеты, в частности на кнопки Ок/Отмена
Отправлено: spectre71 от Ноябрь 26, 2009, 13:37
Ну и не надо тебе убирать кнопку отмена.
У тебя ведь в визарде есть "Cancel" !
1) Если у тебя выбор файла прямо в визарде, то "Cancel" работает как обычно - выходим из визарда с отменой всего.
2) Если у тебя диалог выбора файла повешен на "Finish" визарда, то "Cancel" просто закрывает диалог и пользователь снова может манипулировать с шагами визарда, в том числе и нажать "Finish" или  "Cancel",  "Back",... И это правильно!


Название: Re: QDialog получить указатели на дочерние виджеты, в частности на кнопки Ок/Отмена
Отправлено: spectre71 от Ноябрь 26, 2009, 13:41
А понял, ты воткнул диалог прямо в визард. А может не стоит этого делать? А повесить открытие диалога на "Finish" или "Next"?


Название: Re: QDialog получить указатели на дочерние виджеты, в частности на кнопки Ок/Отмена
Отправлено: spectre71 от Ноябрь 26, 2009, 13:56
Вот тебе пример как можно сделать.
Считай что "Work Path" - выбор файла


Название: Re: QDialog получить указатели на дочерние виджеты, в частности на кнопки Ок/Отмена
Отправлено: CroCIV от Ноябрь 26, 2009, 13:58
ну... можно и на финиш повесить не вопрос, но мне не нравится факт мерцания окошек... одно уничтожается, второе тут же рисуется, чтоб через пару секунд тоже быть закрытым... как-то это.. костылеподобно как-то :)

А тут по идее казалось бы, убираем лишнюю кансел, и получается у нас гармония: кнопка финиш будет доступна тогда и только тогда, когда пользователь нажмет буттон "сохранить", и в то же время дополнительное удобство пользователю, вот он нажал сохранить и придумал вернуться на пару шагов назад что-то там подправить, такое у пользователей бывает часто ))
Вот и вся задача тут сводится к получению двух каких-то там указателей на две кнопки, что может быть проще ... казалось бы  ;D


Название: Re: QDialog получить указатели на дочерние виджеты, в частности на кнопки Ок/Отмена
Отправлено: BRE от Ноябрь 26, 2009, 13:58
Можно попробовать найти эту кнопку по имени (если это имя указано).
Метод:
QList<T> QObject::findChildren ( const QString & name = QString() ) const

Код:
// Вернет список кнопок на dlg с именем cancel
QList<QPushButton *> widgets = dlg.findChildren<QPushButton *>( "cancel" );

// Вернет список всех QPushButton на dlg
QList<QPushButton *> allPButtons = dlg.findChildren<QPushButton *>();


Точнее найти сначала QButtonBox (его имя на диалоге "buttonBox" ), а в нем уже отключить кнопку Cancel.


Название: Re: QDialog получить указатели на дочерние виджеты, в частности на кнопки Ок/Отмена
Отправлено: spectre71 от Ноябрь 26, 2009, 13:59
Можно попробовать найти эту кнопку по имени (если это имя указано).
Метод:
QList<T> QObject::findChildren ( const QString & name = QString() ) const

Код:
// Вернет список кнопок на dlg с именем cancel
QList<QPushButton *> widgets = dlg.findChildren<QPushButton *>( "cancel" );

// Вернет список всех QPushButton на dlg
QList<QPushButton *> allPButtons = dlg.findChildren<QPushButton *>();


А как быть с нативными диалогами? :)


Название: Re: QDialog получить указатели на дочерние виджеты, в частности на кнопки Ок/Отмена
Отправлено: CroCIV от Ноябрь 26, 2009, 14:00
Вот тебе пример как можно сделать.
Считай что "Work Path" - выбор файла

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


Название: Re: QDialog получить указатели на дочерние виджеты, в частности на кнопки Ок/Отмена
Отправлено: BRE от Ноябрь 26, 2009, 14:02
А как быть с нативными диалогами? :)
А нативный можно встроить?
Если Да, то никак.  :)


Название: Re: QDialog получить указатели на дочерние виджеты, в частности на кнопки Ок/Отмена
Отправлено: spectre71 от Ноябрь 26, 2009, 14:03
ну... можно и на финиш повесить не вопрос, но мне не нравится факт мерцания окошек... одно уничтожается, второе тут же рисуется, чтоб через пару секунд тоже быть закрытым... как-то это.. костылеподобно как-то :)

Нет, вызов именно диалога для выбора файла - это как раз стандартно! И это всем будет понятно.
А вот встраивание дилога выбора файла прямо в страницу визарда приводит в замешательство.


Название: Re: QDialog получить указатели на дочерние виджеты, в частности на кнопки Ок/Отмена
Отправлено: CroCIV от Ноябрь 26, 2009, 14:05
Можно попробовать найти эту кнопку по имени (если это имя указано).
Метод:
QList<T> QObject::findChildren ( const QString & name = QString() ) const

Код:
// Вернет список кнопок на dlg с именем cancel
QList<QPushButton *> widgets = dlg.findChildren<QPushButton *>( "cancel" );

// Вернет список всех QPushButton на dlg
QList<QPushButton *> allPButtons = dlg.findChildren<QPushButton *>();


Точнее найти сначала QButtonBox (его имя на диалоге "buttonBox" ), а в нем уже отключить кнопку Cancel.

кстати не пробовал, забыл совсем что у QObject есть такая фича  ::)  щас попробую поискать, спс


Название: Re: QDialog получить указатели на дочерние виджеты, в частности на кнопки Ок/Отмена
Отправлено: spectre71 от Ноябрь 26, 2009, 14:11
Кстати, если сохранение - последний шаг, то лучше будет повесить вызов диалога на "Finish" у визарда, но обозвать кнопку как "Save". А на этой последней странице отобразить некоторый "Info/Log" того что сохраняется.


Название: Re: QDialog получить указатели на дочерние виджеты, в частности на кнопки Ок/Отмена
Отправлено: BRE от Ноябрь 26, 2009, 14:18
Я делаю как предложил Spectre c диалогом Work Path. И ничего, если страница будет не сильно заполнена. Всегда можно добавить какую-то информацию для юзера, режимы сохранения и т.д.

В твоем случае, даже если отключить Cancel, пользователю нужно догадаться нажимать Ok на диалоге, и только после этого будет включиться кнопка Finish. Не очень удобно.


Название: Re: QDialog получить указатели на дочерние виджеты, в частности на кнопки Ок/Отмена
Отправлено: CroCIV от Ноябрь 26, 2009, 14:30
Кстати, если сохранение - последний шаг, то лучше будет повесить вызов диалога на "Finish" у визарда, но обозвать кнопку как "Save". А на этой последней странице отобразить некоторый "Info/Log" того что сохраняется.
хм... вариант, а форму закрывать по кнопке отмена, которую переименовываем в "закрыть"...
но пользователи выбрали первый вариант
findChildren<QPushButton *>() возвращает список на две безымянные кнопки - первая сохранить/ок, вторая отмены

Ребят, спасибо  :)


Название: Re: QDialog получить указатели на дочерние виджеты, в частности на кнопки Ок/Отмена
Отправлено: spectre71 от Ноябрь 26, 2009, 14:39
Кстати, если сохранение - последний шаг, то лучше будет повесить вызов диалога на "Finish" у визарда, но обозвать кнопку как "Save". А на этой последней странице отобразить некоторый "Info/Log" того что сохраняется.
хм... вариант, а форму закрывать по кнопке отмена, которую переименовываем в "закрыть"...
но пользователи выбрали первый вариант
findChildren<QPushButton *>() возвращает список на две безымянные кнопки - первая сохранить/ок, вторая отмены

Ребят, спасибо  :)

Непереносимо ! Очередной релиз QT может это поломать. :)

Лучше тебе сделать вызов диалога на "Save"("Finish") Визарда, но при нажатии в диалоге на "Save" закрывать его и Визард.