Russian Qt Forum
Ноябрь 25, 2024, 18:02 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: Всплывающий виджет  (Прочитано 13298 раз)
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

Сообщений: 864

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


Просмотр профиля
« Ответ #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.059 секунд. Запросов: 23.