Russian Qt Forum

Qt => Пользовательский интерфейс (GUI) => Тема начата: uriel от Февраль 29, 2008, 17:22



Название: Всплывающий виджет
Отправлено: uriel от Февраль 29, 2008, 17:22
Нужно изобразить примерно следующее:
Есть окно приложения, в нем есть некие кнопочки. При нажатии на них должен появляться составной самодельный виджет. Через него осуществляются некие манипуляции и по нажатию на, скажем, Escape, виджет исчезает. Кроме того, он должен быть модальным.
Если просто делать его потомком окна, то получается, что с краю он обрезается его границей. Если делать без parent'а со флагом Qt::FramelessWindowHint, то на панельке появляется ещё одно окно, что тоже нежелательно.
Путём долгих манипуляций установил, что проблема решается с помощью комбинации флагов Qt::Tool | Qt::FramelessWindowHint. Модальность тоже работает.
А теперь собственно проблема. Этот виджет никаким образом не хочет становиться активным и получать фокус с клавиатуры. grabKeyboard(), raise(), activateWindow(), setFucus() и прочее не помогает. Фокус он ловит только после клика мышкой где угодно или сворачивания-разворачивания окна. sendEvent() мышеклика не помогает.
Может быть есть менее извращённый способ реализовать подобное?
Заранее спасибо. ;)


Название: Re: Всплывающий виджет
Отправлено: ритт от Февраль 29, 2008, 18:11
Код:
	frame = new QFrame(parent);
frame->setWindowFlags(Qt::SplashScreen);
frame->setFrameShape(QFrame::StyledPanel);
frame->setFrameShadow(QFrame::Raised);
frame->setMinimumSize(QSize(200, 200));

оно? или неправильно понял?


Название: Re: Всплывающий виджет
Отправлено: uriel от Февраль 29, 2008, 18:55
В принципе, оно, спасибо.
У меня почти так и реализовано. Разница только в том, что Qt::Tool | Qt::FramelessWindowHint заменили на Qt::SplashScreen.
Код:
myWidget *tmp = new myWidget(parent);
tmp->setWindowFlags(Qt::Tool | Qt::FramelessWindowHint);
tmp->setGeometry(QCursor::pos().x(), QCursor::pos().y(), tmp->width(), tmp->height());
tmp->setFrameStyle(QFrame::Panel | QFrame::Raised);
tmp->setLineWidth(2);
tmp->show();
Причём, grabKeyboard() уже заставляет его реагировать на нажатие Escape.
Теперь вопрос, как мне передать фокус полю ввода внутри этого виджета?
tmp->innerWidget->setFocus(); не работает. Приходится специально тыкнуть мышкой по виджету - тогда хватает.


Название: Re: Всплывающий виджет
Отправлено: Вячеслав от Февраль 29, 2008, 19:39
может
Цитировать
void QWidget::setFocusProxy ( QWidget * w )
Sets the widget's focus proxy to widget w. If w is 0, the function resets this widget to have no focus proxy.
Some widgets can "have focus", but create a child widget, such as QLineEdit, to actually handle the focus. In this case, the widget can set the line edit to be its focus proxy.
setFocusProxy() sets the widget which will actually get focus when "this widget" gets it. If there is a focus proxy, setFocus() and hasFocus() operate on the focus proxy.
спасет ?


Название: Re: Всплывающий виджет
Отправлено: uriel от Февраль 29, 2008, 19:50
Неа. :)
Фокус можно поставить и напрямую, и всё будет работать, только после клика.
Фишка в том, что сам виджет при этом не активен. Если по нему кликнуть, то фокус сразу же обнаружится на требуемом поле.
В том-то и проблема, чтобы программно сделать виджет активным.


Название: Re: Всплывающий виджет
Отправлено: uriel от Февраль 29, 2008, 20:19
Хм...проверил под Windows - всё Ок.
Выходит, такая штука получается из-за иксов. Занятно.


Название: Re: Всплывающий виджет
Отправлено: AlekseyK от Сентябрь 23, 2009, 18:57
tmp->innerWidget->setFocus(); не работает. Приходится специально тыкнуть мышкой по виджету - тогда хватает.
У меня тоже почему-то. Только я не понял: как это вылечить?!


Название: Re: Всплывающий виджет
Отправлено: AlekseyK от Сентябрь 23, 2009, 19:03
Ещё вопрос: можно, чтобы виджет как-то плавно всплывал?


Название: Re: Всплывающий виджет
Отправлено: xokc от Сентябрь 23, 2009, 21:21
http://habrahabr.ru/blogs/qt_software/69316/ ?


Название: Re: Всплывающий виджет
Отправлено: AlekseyK от Сентябрь 24, 2009, 12:03
Ага интересно, спасибо, выйдет 4.6 - освоим.

Народ, а почему всё таки фокус всплывающему виджету не передаётся?!


Название: Re: Всплывающий виджет
Отправлено: Alex Custov от Сентябрь 24, 2009, 13:14
Ага интересно, спасибо, выйдет 4.6 - освоим.

Народ, а почему всё таки фокус всплывающему виджету не передаётся?!

Qt Animation Framework ты можешь и так использовать (http://qt.nokia.com/products/appdev/add-on-products/catalog/4/Utilities/qtanimationframework), и не ждать 4.6


Название: Re: Всплывающий виджет
Отправлено: AlekseyK от Сентябрь 24, 2009, 13:20
Qt Animation Framework ты можешь и так использовать (http://qt.nokia.com/products/appdev/add-on-products/catalog/4/Utilities/qtanimationframework), и не ждать 4.6
Я думал, что это только для графики.


Название: Re: Всплывающий виджет
Отправлено: panAlexey от Сентябрь 24, 2009, 19:13
tmp->innerWidget->setFocus(); не работает. Приходится специально тыкнуть мышкой по виджету - тогда хватает.
У меня тоже почему-то. Только я не понял: как это вылечить?!
положи на этот всплывающий виджет QFrame или производное от него и с ним манипулируй.
будет тебе фокус.


Название: Re: Всплывающий виджет
Отправлено: AlekseyK от Сентябрь 25, 2009, 12:26
положи на этот всплывающий виджет QFrame или производное от него и с ним манипулируй. будет тебе фокус.
Так этот всплывающий виджет и есть QFrame. Иле ещё один внутрь него поместить?!


Название: Re: Всплывающий виджет
Отправлено: AlekseyK от Октябрь 27, 2009, 14:01
Народ, а почему всё таки фокус всплывающему виджету не передаётся?!
Нашёл, нужно сначала сделать так:
Код:
QApplication::setActiveWindow(this);
где this - всплывающий виджет вызываю в showEvent(QShowEvent *event) методе (тоже самое можно сделать в вызывающем виджете/методе), а затем уже:
Код:
setFocusProxy(ui->spinBox);
где spinBox - нужный мне элемент управления.