Russian Qt Forum

Qt => Пользовательский интерфейс (GUI) => Тема начата: lighting от Сентябрь 30, 2010, 15:41



Название: Управление поведением кнопок
Отправлено: lighting от Сентябрь 30, 2010, 15:41
Есть некий внешний объект которым я управляю из программы. Логика управления как у выключателя - при нажатии посылается команда устройству, если оно его обработало кнопка вдавливается, если сновать нажать то посылается другая команда и в случае успеха кнопка выдавливается обратно. В случае-же если команда не обработана - кнопка свое состояние менять не должна.
Задача вроде-бы простая, но с помощью PushButton ее у меня решить не получается - пробовал и Checkable и  setDown, в обоих случаях кнопка реагирует на нажатия немедленно. Можно конечно заменить кнопку на QLabel  и обрабатывать событие нажатия мыши, но хотелось-бы всетаки сделать это через PushButton
Версия Qt 4.5


Название: Re: Управление поведением кнопок
Отправлено: GreatSnake от Сентябрь 30, 2010, 15:47
QToolButton, QToolButton::setChecked()


Название: Re: Управление поведением кнопок
Отправлено: lighting от Сентябрь 30, 2010, 16:06
А можно поподробнее? Как заставить toolButton не нажиматься до тех пор пока не придет ответ от управляемого устройства? На события мышки она реагирует немедленно тут-же нажимаясь.


Название: Re: Управление поведением кнопок
Отправлено: DOOMer от Сентябрь 30, 2010, 17:13
А чем не устраивает простое блокирование/разблокирование кнопки при помощи метода setEnabled(false | true)? Вы же все равно как-то обрабатываете ответ от управляемого устройства, вот и можете при этом ещё и разблокировать кнопку.


Название: Re: Управление поведением кнопок
Отправлено: lighting от Сентябрь 30, 2010, 23:08
Во-первых у Diasbled кнопки внешний вид другой, а во-вторых АФАИК такая кнопка события мыши не принимает.


Название: Re: Управление поведением кнопок
Отправлено: DOOMer от Сентябрь 30, 2010, 23:21
А вам разве не надо как раз таки НЕ принимать события мыши некоторое время?

Цитировать
Как заставить toolButton не нажиматься до тех пор пока не придет ответ от управляемого устройства?

Отправили сигнал устройству -- вдавили и задизаблили кнопку.
Получили ответ от устройства -- отдизаблили кнопкуи оставили её вдавленной (isChecked) если  необходимо.


Название: Re: Управление поведением кнопок
Отправлено: lighting от Октябрь 01, 2010, 08:42
В том-то и дело что сигнал отправляется по нажатию. В предлагаемом вам варианте либо сигнал отправить не удастся (кнопка задизаблена) либо при нажатии кнопка сразу вдавиться даже если первой командой в слоте будет pushButton.setEnabled(false) и уже потом она станет неактивной. Мне-же надо чтобы она вообще не нажималась, точнее чтобы от мышки она только события принимала, а все действия (нажатие, отжатие) только по ответу от управляемого устройства.

Видимо придется взять QLabel и нужную мне логику работы реализовывать вручную.


Название: Re: Управление поведением кнопок
Отправлено: navrocky от Октябрь 03, 2010, 00:53
Не хорошо это блокировать нажатия кнопки, пользователь будет думать что у него мышь поломалась.

Но если тебе всё-таки эта идея нравится, можешь перехватить клики мыши по кнопке через installEventFilter и в саму кнопку их не пускать, соответственно она нажиматься сама не будет, тогда сможешь рулить ей через setChecked...


Название: Re: Управление поведением кнопок
Отправлено: lighting от Октябрь 04, 2010, 08:51
Цитата: navrocky
Не хорошо это блокировать нажатия кнопки, пользователь будет думать что у него мышь поломалась.
В некоторых случаях это меньшее из зол, куда хуже будет если кнопка нажмется, оператор будет уверен что все нормально, а команда не пройдет.
За EventFilter спасибо, попробую.


Название: Re: Управление поведением кнопок
Отправлено: navrocky от Октябрь 04, 2010, 09:56
Цитировать
В некоторых случаях это меньшее из зол, куда хуже будет если кнопка нажмется, оператор будет уверен что все нормально, а команда не пройдет.
Ну так отожми ее и кинь сообщение об ошибке, например, через QMessageBox.