Russian Qt Forum

Qt => Пользовательский интерфейс (GUI) => Тема начата: Гурман от Июнь 09, 2010, 15:53



Название: кнопка Apply не работает в ButtonBox
Отправлено: Гурман от Июнь 09, 2010, 15:53
нарисовал бокс с 3-мя Ok, Cancel, Apply (для последней взвел флажок в редакторе бокса в QDesigner), бокс поместил на Qdialog

2 первые кнопки сами соединились со слотами диалога, переопределил их, все хорошо, при нажатии Ok вызывается сначала accept() потом done(), при Cancel сначала reject() потом done()

но кнопка Apply, хоть и стандартная, но никуда не присоединилась, и че-то сразу как-то не видно, как сделать, чтобы при ее нажатии вызывался только accept() как должно быть по ее логике

в дизайнере при редактировании связей от нее нет сигнала, и в описании бокса не видно, как добраться до кнопки по ее номеру или названию


Название: Re: кнопка Apply не работает в ButtonBox
Отправлено: Kolobok от Июнь 09, 2010, 16:41
Не знаю, чем ты читаешь...

QDialogButtonBox::clicked ( QAbstractButton * button )
QDialogButtonBox::buttonRole ( QAbstractButton * button )
QDialogButtonBox::ApplyRole


Название: Re: кнопка Apply не работает в ButtonBox
Отправлено: Гурман от Июнь 09, 2010, 17:14
ну и толку???

это же надо самому разобрать, что нажата именно кнопка Apply и вызывать слот accept()

тогда как правильно было бы сразу соединить сигнал этой кнопки с accept() и ничего разбирать не надо

добраться до кнопки я хочу, чтобы в конструкторе диалога connect сделать, раз дизайнер сам не смог, хотя 100% мог бы


Название: Re: кнопка Apply не работает в ButtonBox
Отправлено: BRE от Июнь 09, 2010, 17:22
тогда как правильно было бы сразу соединить сигнал этой кнопки с accept() и ничего разбирать не надо
Это не правильно.
И accept и reject закрывают диалог, а для apply этого не требуется.
Посмотри как они описаны в исходниках:
Код
C++ (Qt)
void QDialog::accept()
{
   done(Accepted);
}
 
void QDialog::reject()
{
   done(Rejected);
}
 

добраться до кнопки я хочу, чтобы в конструкторе диалога connect сделать, раз дизайнер сам не смог, хотя 100% мог бы
Посмотри на:
QPushButton * QDialogButtonBox::button ( StandardButton which ) const


Название: Re: кнопка Apply не работает в ButtonBox
Отправлено: Гурман от Июнь 09, 2010, 17:34
Цитировать
Посмотри на:
QPushButton * QDialogButtonBox::button ( StandardButton which ) const

я и попытался его использовать, но что-то не получилось, и... рабочий день закончился, исходников дома нет

Цитировать
accept и reject закрывают диалог, а для apply этого не требуется.
Посмотри как они описаны в исходниках:

кхе... это несколько неожиданно... могли бы и предупредить  :(

я подумал сначала, кнопка ОК через промежуточный слот сначала сигнал посылает в accept() потом в done() - в первый, чтобы принять изменения, во второй чтобы закрыть диалог, не совсем понятно, нафига тогда эти accept() и reject(), можно было бы спокойно обойтись одним единственным done(int), не было бы повода для заблуждений

и как-то странно - кнопки Apply и десяток других "стандартных" есть, а у QDialog слотов готовых для них... нет


Название: Re: кнопка Apply не работает в ButtonBox
Отправлено: BRE от Июнь 09, 2010, 17:36
кхе... это несколько неожиданно... могли бы и предупредить  :(
Куда уж больше предупреждать:
Цитировать
void QDialog::accept ()   [virtual slot]
Hides the modal dialog and sets the result code to Accepted.
;)


Название: Re: кнопка Apply не работает в ButtonBox
Отправлено: BRE от Июнь 09, 2010, 17:38
можно было бы спокойно обойтись одним единственным done(int), не было бы повода для заблуждений
Попробуй соединить сигнал QPushButton::clicked() со слотом QDialog::done( int ).  ;)


Название: Re: кнопка Apply не работает в ButtonBox
Отправлено: Гурман от Июнь 09, 2010, 17:43
можно было бы спокойно обойтись одним единственным done(int), не было бы повода для заблуждений
Попробуй соединить сигнал QPushButton::clicked() со слотом QDialog::done( int ).  ;)

если бы сигнал имел вид QPushButton::clicked(ButtonRole role), а слот QDialog::done(ButtonRole role) все бы замечательно соединялось!

Цитировать
Куда уж больше предупреждать

имелось в виду - предупредить, что для этого просто вызывается done()


Название: Re: кнопка Apply не работает в ButtonBox
Отправлено: crossly от Июнь 09, 2010, 17:46
на то и есть
Код:
void QDialogButtonBox::clicked ( QAbstractButton * button )   [signal]


Название: Re: кнопка Apply не работает в ButtonBox
Отправлено: BRE от Июнь 09, 2010, 17:47
если бы сигнал имел вид QPushButton::clicked(ButtonRole role), а слот QDialog::done(ButtonRole role) все бы замечательно соединялось!
::)
А какую роль должна передавать кнопка, например, "Установить персональные данные"?


Название: Re: кнопка Apply не работает в ButtonBox
Отправлено: Гурман от Июнь 09, 2010, 17:52
Цитировать
А какую роль должна передавать кнопка, например, "Установить персональные данные"?

так это же нестандартная кнопка

я про стандартные

но разумеется, если есть некий набор "стандартных" кнопок, то я бы ожидал, что у приемников для них есть набор стандартных реакций, то есть, у QDialog должен быть слот apply() и несколько других, соответствующих набору стандартных кнопок у QDialogButtonBox, а у этого класса соответствующий набор сигналов, которые подключаются автоматом при использовании "стандартных" кнопок

тогда включение использования "стандартной" кнопки в дизайнере просто соединяло бы ее с соответствующим слотом, и никаких вопросов не возникнет


Название: Re: кнопка Apply не работает в ButtonBox
Отправлено: crossly от Июнь 09, 2010, 18:05
возникает.... а что должен делать слот apply() стандартного  диалога ??


Название: Re: кнопка Apply не работает в ButtonBox
Отправлено: Гурман от Июнь 09, 2010, 18:16
возникает.... а что должен делать слот apply() стандартного  диалога ??

а что в наследующем его классе программист напишет, то и должен... от стандартных accept и reject в QDialog толку ровно 0 - они просто окно диалога закрывают, их все равно переопределять надо, аналогично и apply(), и остальные



Название: Re: кнопка Apply не работает в ButtonBox
Отправлено: Kolobok от Июнь 09, 2010, 18:53
Нарисуй слот apply() и сделай так

Код:
QPushButton * btn = buttonBox->button ( QDialogButtonBox::Apply );
connect( btn, SIGNAL( clicked() ), buttonBox, SLOT( apply() ) );

Кнопка Apply в QDialogButtonBox не обязательна. Поэтому, имхо, и слота нет.


Название: Re: кнопка Apply не работает в ButtonBox
Отправлено: Гурман от Июнь 09, 2010, 19:16
так и сделаю, но кнопка же готовая вроде есть уже... хотя наверно если в дезайнере ее включить, то в .ui файл такой же вызов button() и прописывается...



Название: Re: кнопка Apply не работает в ButtonBox
Отправлено: ритт от Июнь 10, 2010, 01:03
возникает.... а что должен делать слот apply() стандартного  диалога ??

а что в наследующем его классе программист напишет, то и должен... от стандартных accept и reject в QDialog толку ровно 0 - они просто окно диалога закрывают, их все равно переопределять надо, аналогично и apply(), и остальные

accept и reject используются не только в качестве слотов.
а раз уж программист всё-равно будет наследоваться и чего-то там писать, на кой нужен пустой публичный слот? правильно, совсем не нужен...


Название: Re: кнопка Apply не работает в ButtonBox
Отправлено: Гурман от Июнь 10, 2010, 07:13
фишка была бы в том, что если в дизайнере взведен флажок у кнопки Apply или у еще нескольких других, и они сразу появились на окне, то они уже соединены с приемником - ради этого по лишней инструкции RET и записи в таблице виртуальных методов не сильно повредили бы... просто стало бы где-то чуть удобнее


Название: Re: кнопка Apply не работает в ButtonBox
Отправлено: BRE от Июнь 10, 2010, 07:23
фишка была бы в том, что если в дизайнере взведен флажок у кнопки Apply или у еще нескольких других, и они сразу появились на окне, то они уже соединены с приемником - ради этого по лишней инструкции RET и записи в таблице виртуальных методов не сильно повредили бы... просто стало бы где-то чуть удобнее
Причем здесь таблицы виртуальных методов....
Что это даст? Возможность посильней размазать функционал по GUI? Так это очень плохая практика.


Название: Re: кнопка Apply не работает в ButtonBox
Отправлено: Гурман от Июнь 10, 2010, 08:13
Цитировать
Что это даст?

некоторую дополнительную автоматизацию, отсутствие необходимости руками писать лишнюю пару строк, вместо рутины один клик - собственно для этого Дизайнер предназначен, если в ui_*.h посмотреть, то видно, от какой рутины он избавляет


Название: Re: кнопка Apply не работает в ButtonBox
Отправлено: BRE от Июнь 10, 2010, 08:20
некоторую дополнительную автоматизацию, отсутствие необходимости руками писать лишнюю пару строк, вместо рутины один клик - собственно для этого Дизайнер предназначен, если в ui_*.h посмотреть, то видно, от какой рутины он избавляет
Сейчас в QDialogButtonBox 19 стандартных кнопок, большинство из которых не нужно обрабатывать в классе самого диалога. Для чего для них всех заготавливать пустые методы, которые в большинстве случаев никто не будет переопределять?
Вредно в GUI вставлять функционал. Диалог должен только показать что-то и вернуть выбор пользователя, никаких действий этот класс делать не должен. Кстати, как и любой другой GUI-элемент.


Название: Re: кнопка Apply не работает в ButtonBox
Отправлено: Гурман от Июнь 10, 2010, 09:27
из этих 19-ти несколько имело бы смысл автоматически связывать с соответствующими слотами в диалоге, потому как придется это делать

тут другая непонятка... в дизайнере кнопки надписаны праввильно, по-русски Отмена и Применить

но в приложении вылазит Cancel и Apply почему-то, хотя в остальных местах везде все верно, и локаль стоит разумеется Russian


Название: Re: кнопка Apply не работает в ButtonBox
Отправлено: BRE от Июнь 10, 2010, 09:31
но в приложении вылазит Cancel и Apply почему-то, хотя в остальных местах везде все верно, и локаль стоит разумеется Russian
А ты переводы загружаешь?


Название: Re: кнопка Apply не работает в ButtonBox
Отправлено: Гурман от Июнь 10, 2010, 09:59
Цитировать
ты переводы загружаешь?

это translate() в .ui файле, который включается флажком translatable в дизайнере? да, разумеется это все есть


Название: Re: кнопка Apply не работает в ButtonBox
Отправлено: BRE от Июнь 10, 2010, 10:00
это translate() в .ui файле, который включается флажком translatable в дизайнере? да, разумеется это все есть
Имеется ввиду .qm файл с переводом?


Название: Re: кнопка Apply не работает в ButtonBox
Отправлено: Гурман от Июнь 10, 2010, 10:34
а, не, это еще не делалось

но почему тогда в дизайнере берется "системная" надпись, а в приложении нет?

если нет файла перевода, Qt мог бы использовать надписи в соответствии с системной локалью (их же можно получить, если очень захотеть), а если есть, то из него


Название: Re: кнопка Apply не работает в ButtonBox
Отправлено: BRE от Июнь 10, 2010, 10:42
но почему тогда в дизайнере берется "системная" надпись, а в приложении нет?
А дизайнер - молодец, он переводы загружает.  :)

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


Название: Re: кнопка Apply не работает в ButtonBox
Отправлено: Гурман от Июнь 10, 2010, 11:15
ИМХО - граздо лучше, если бы в дизайнере можно было редактировать надписи на кнопках в редакторе свойств QDialogButtonBox, там где флажки включения кнопок устанавливаются

тогда я бы там просто по локали вписались автоматом русские надписи, а потом, когда надо будет переводить, уже сменились на английские

а так мне теперь еще строки кода добавлять, чтобы надписи по-умолчанию были на русском... лишние сущности...


Название: Re: кнопка Apply не работает в ButtonBox
Отправлено: BRE от Июнь 10, 2010, 11:20
а так мне теперь еще строки кода добавлять, чтобы надписи по-умолчанию были на русском... лишние сущности...
А для чего тогда использовать QDialogButtonBox?
Ну и добавь на диалог QPushButton.

Но все же это не очень хорошая практика. В программе лучше все строки задавать на английском и делать файлы переводов для разных языков. Проблем меньше будет.


Название: Re: кнопка Apply не работает в ButtonBox
Отправлено: Гурман от Июнь 10, 2010, 11:24
у меня основной заказчик - русский, и требование его - русский интерфейс, с возможностью перевода на другие языки, отсюда и танцуем

не переводить же каждый раз с английского на русский, при каждой промежуточной демонстрации или сдаче этапа...


Название: Re: кнопка Apply не работает в ButtonBox
Отправлено: Kolobok от Июнь 10, 2010, 11:25
А стандартные диалоги ты как переводить будешь?


Название: Re: кнопка Apply не работает в ButtonBox
Отправлено: Гурман от Июнь 10, 2010, 11:29
какие стандартные? не было...  ;D

если где-то вылезет английский, значит буду писать код, который будет принудительно менять надписи перед открытием диалога, другого варианта нет


Название: Re: кнопка Apply не работает в ButtonBox
Отправлено: BRE от Июнь 10, 2010, 11:29
не переводить же каждый раз с английского на русский, при каждой промежуточной демонстрации или сдаче этапа...
А ты почитай как происходит локализация приложений.
Там все уже придумано до нас и инструменты готовые есть, сильно жизнь упрощающие.


Название: Re: кнопка Apply не работает в ButtonBox
Отправлено: BRE от Июнь 10, 2010, 11:30
если где-то вылезет английский, значит буду писать код, который будет принудительно менять надписи перед открытием диалога, другого варианта нет
Правильно-правильно, работа должна напоминать ад.
Иначе, за что программистам зарплату платят.  :)


Название: Re: кнопка Apply не работает в ButtonBox
Отправлено: Гурман от Июнь 10, 2010, 11:37
Цитировать
ты почитай как происходит локализация приложений

я это читал, но в моем случае возможная "локализация" - это перевод на другой язык, отличный от русского  ;)

Цитировать
работа должна напоминать ад

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


Название: Re: кнопка Apply не работает в ButtonBox
Отправлено: crossly от Июнь 10, 2010, 11:40
Цитировать
но в моем случае "локализация" - это перевод на другой язык, отличный от русского 
а в других случаях это как по твоему??


Название: Re: кнопка Apply не работает в ButtonBox
Отправлено: Гурман от Июнь 10, 2010, 12:03
а в других случаях, это когда делают сначала на английском...  ;D

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


Название: Re: кнопка Apply не работает в ButtonBox
Отправлено: Авварон от Июнь 10, 2010, 12:13
убей себя, пожалуйста...
Код:
    QApplication app(argc, argv);

    app.setApplicationName("xxx");
    app.setOrganizationName("xxx");

    QString locale = QLocale::system().name();
    QTranslator qtTranslator;

    qtTranslator.load(QString("qt_") + locale);
    app.installTranslator(&qtTranslator);


Название: Re: кнопка Apply не работает в ButtonBox
Отправлено: Гурман от Июнь 10, 2010, 12:19
Цитировать
убей себя, пожалуйста...

да нифига... это все будет сделано потом, и если понадобится, и за перевод текстов будет отдельно платиться переводчику перед выпуском версии 1.0.0, когда все сообщения устаканятся, к тому времени их еще много появится, и количество строк кода вырастет раза в 1.5 а то и 2

а пока альфа, потом пре-бета, потом бета, потом пре-релиз - иностранный язык никому не нужен, сейчас все должно быть на русском и точка


Название: Re: кнопка Apply не работает в ButtonBox
Отправлено: Kolobok от Июнь 10, 2010, 12:22
какие стандартные? не было...  ;D


Посмотри разделы Static Public Members в наследниках QDialog. Или ты уверен, что это тебе никогда не понадобится? И это всё из-за трех строчек в коде?


Название: Re: кнопка Apply не работает в ButtonBox
Отправлено: Авварон от Июнь 10, 2010, 12:24
Гурман
ты вообще читаешь, что тебе пишут? ПИШИ СВОИ СТРОКИ НА РУССКОМ, НО ФАЙЛ ПЕРЕВОДА КУТЕ ЗАГРУЗИ. А не ной что в дизайнере чего-то нет.


Название: Re: кнопка Apply не работает в ButtonBox
Отправлено: Гурман от Июнь 10, 2010, 12:39
а это... блин, у меня колорпикер не хочет в дизайнере появляться, а кодом его в диалог настроек я не хочу вписывать, это геморрой

придется в студии теперь самому проект для сборки плагина городить...

ну загрузил... все равно, лучше было бы, чтобы в Дизайнере можно было надписи менять, например, вместо ОК написать другой текст, поскольку ОК - это не по русски


Название: Re: кнопка Apply не работает в ButtonBox
Отправлено: BRE от Июнь 10, 2010, 12:44
а это... блин, у меня колорпикер не хочет в дизайнере появляться, а кодом его в диалог настроек я не хочу вписывать, это геморрой
В дизайнере есть Promote to...

ну загрузил... все равно, лучше было бы, чтобы в Дизайнере можно было надписи менять, например, вместо ОК написать другой текст, поскольку ОК - это не по русски
Повторюсь, не используй тогда QDialogButtonBox, используй обычные кнопки QPushButton. В чем проблема?


Название: Re: кнопка Apply не работает в ButtonBox
Отправлено: crossly от Июнь 10, 2010, 12:47
человек-катастрофа....


Название: Re: кнопка Apply не работает в ButtonBox
Отправлено: Авварон от Июнь 10, 2010, 12:50
Гурман
совет по юзабилити - несмотря на то, что "ОК" не по-русски, это стандарт, введенный мелкософтом и его лучше приддерживаться. Ни что так не раздражает, как диалоги сохранения в линукс с 3мя кнопками и тучей текста на них ("не сохранять этот файл" "сохранить этот файл" "отменить сохранение этого файла" вместо привычных "сохранить" "не сохранять" "отмена"). Так что совет - подумать, прежде чем писать отсебятину на кнопке (хотя иногда это да, надо - пример - кнопки под окошком, в к-ое я печатаю это сообщение)


Название: Re: кнопка Apply не работает в ButtonBox
Отправлено: Гурман от Июнь 10, 2010, 12:56
Цитировать
В дизайнере есть Promote to...

это где? у меня оно все по-русски

как выяснилось, очевидно из-за того, что я собрал плагин mingw, никто до последнего момента (http://www.prog.org.ru/topic_13937_0.html) не предупреждал, что для дизайнера в винде его надо собирать в студии


Название: Re: кнопка Apply не работает в ButtonBox
Отправлено: Авварон от Июнь 10, 2010, 13:03
тебе еще раз прочесть лекцию о различии дизайнера и плагина дизайнера к креатору?
кстати что мешает воспользоваться внешним дизайнером, он mingw собран?


Название: Re: кнопка Apply не работает в ButtonBox
Отправлено: kdm от Июнь 12, 2010, 01:06
Цитировать
некоторую дополнительную автоматизацию, отсутствие необходимости руками писать лишнюю пару строк, вместо рутины один клик - собственно для этого Дизайнер предназначен, если в ui_*.h посмотреть, то видно, от какой рутины он избавляет
А мне нравится больше вручную все прописывать, нудно, но доставляет особые ощущения %)


Название: Re: кнопка Apply не работает в ButtonBox
Отправлено: Гурман от Июнь 12, 2010, 17:43
угу, когда мало чего прописывать, можно и вручную, но когда только на странице настроек цветов 20 контролов, а страниц настроек полтора десятка...


Название: Re: кнопка Apply не работает в ButtonBox
Отправлено: vipet от Июнь 12, 2010, 19:27
Дизайнер - зло. Я тоже все делаю руками. И особенно сложные формы/лэйауты это имеет больший смысл делать. Если потом что-то надо переделать, то так даже проще.