Russian Qt Forum
Июля 03, 2025, 15:55 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: Всплывающий виджет  (Прочитано 13605 раз)
uriel
Гость
« : Февраля 29, 2008, 17:22 »

Нужно изобразить примерно следующее:
Есть окно приложения, в нем есть некие кнопочки. При нажатии на них должен появляться составной самодельный виджет. Через него осуществляются некие манипуляции и по нажатию на, скажем, Escape, виджет исчезает. Кроме того, он должен быть модальным.
Если просто делать его потомком окна, то получается, что с краю он обрезается его границей. Если делать без parent'а со флагом Qt::FramelessWindowHint, то на панельке появляется ещё одно окно, что тоже нежелательно.
Путём долгих манипуляций установил, что проблема решается с помощью комбинации флагов Qt::Tool | Qt::FramelessWindowHint. Модальность тоже работает.
А теперь собственно проблема. Этот виджет никаким образом не хочет становиться активным и получать фокус с клавиатуры. grabKeyboard(), raise(), activateWindow(), setFucus() и прочее не помогает. Фокус он ловит только после клика мышкой где угодно или сворачивания-разворачивания окна. sendEvent() мышеклика не помогает.
Может быть есть менее извращённый способ реализовать подобное?
Заранее спасибо. Подмигивающий
Записан
ритт
Гость
« Ответ #1 : Февраля 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));

оно? или неправильно понял?
Записан
uriel
Гость
« Ответ #2 : Февраля 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(); не работает. Приходится специально тыкнуть мышкой по виджету - тогда хватает.
« Последнее редактирование: Февраля 29, 2008, 18:57 от uriel » Записан
Вячеслав
Гость
« Ответ #3 : Февраля 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.
спасет ?
Записан
uriel
Гость
« Ответ #4 : Февраля 29, 2008, 19:50 »

Неа. Улыбающийся
Фокус можно поставить и напрямую, и всё будет работать, только после клика.
Фишка в том, что сам виджет при этом не активен. Если по нему кликнуть, то фокус сразу же обнаружится на требуемом поле.
В том-то и проблема, чтобы программно сделать виджет активным.
Записан
uriel
Гость
« Ответ #5 : Февраля 29, 2008, 20:19 »

Хм...проверил под Windows - всё Ок.
Выходит, такая штука получается из-за иксов. Занятно.
Записан
AlekseyK
Гость
« Ответ #6 : Сентября 23, 2009, 18:57 »

tmp->innerWidget->setFocus(); не работает. Приходится специально тыкнуть мышкой по виджету - тогда хватает.
У меня тоже почему-то. Только я не понял: как это вылечить?!
Записан
AlekseyK
Гость
« Ответ #7 : Сентября 23, 2009, 19:03 »

Ещё вопрос: можно, чтобы виджет как-то плавно всплывал?
Записан
xokc
Птица говорун
*****
Offline Offline

Сообщений: 976



Просмотр профиля
« Ответ #8 : Сентября 23, 2009, 21:21 »

http://habrahabr.ru/blogs/qt_software/69316/ ?
Записан
AlekseyK
Гость
« Ответ #9 : Сентября 24, 2009, 12:03 »

Ага интересно, спасибо, выйдет 4.6 - освоим.

Народ, а почему всё таки фокус всплывающему виджету не передаётся?!
Записан
Alex Custov
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2063


Просмотр профиля
« Ответ #10 : Сентября 24, 2009, 13:14 »

Ага интересно, спасибо, выйдет 4.6 - освоим.

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

Qt Animation Framework ты можешь и так использовать, и не ждать 4.6
Записан
AlekseyK
Гость
« Ответ #11 : Сентября 24, 2009, 13:20 »

Qt Animation Framework ты можешь и так использовать, и не ждать 4.6
Я думал, что это только для графики.
Записан
panAlexey
Гипер активный житель
*****
Offline Offline

Сообщений: 865

Акцио ЗАРПЛАТА!!!!! :(


Просмотр профиля
« Ответ #12 : Сентября 24, 2009, 19:13 »

tmp->innerWidget->setFocus(); не работает. Приходится специально тыкнуть мышкой по виджету - тогда хватает.
У меня тоже почему-то. Только я не понял: как это вылечить?!
положи на этот всплывающий виджет QFrame или производное от него и с ним манипулируй.
будет тебе фокус.
Записан

Win Xp SP-2, Qt4.3.4/MinGW. http://trdm.1gb.ru/
AlekseyK
Гость
« Ответ #13 : Сентября 25, 2009, 12:26 »

положи на этот всплывающий виджет QFrame или производное от него и с ним манипулируй. будет тебе фокус.
Так этот всплывающий виджет и есть QFrame. Иле ещё один внутрь него поместить?!
Записан
AlekseyK
Гость
« Ответ #14 : Октября 27, 2009, 14:01 »

Народ, а почему всё таки фокус всплывающему виджету не передаётся?!
Нашёл, нужно сначала сделать так:
Код:
QApplication::setActiveWindow(this);
где this - всплывающий виджет вызываю в showEvent(QShowEvent *event) методе (тоже самое можно сделать в вызывающем виджете/методе), а затем уже:
Код:
setFocusProxy(ui->spinBox);
где spinBox - нужный мне элемент управления.
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.022 секунд. Запросов: 20.