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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: Виртуальная клавиатура и модальные окна  (Прочитано 5815 раз)
NeTomat
Гость
« : Февраль 03, 2012, 13:21 »

Добрый день!

Делаю программу с поддержкой виртуальной клавиатуры под Windows переопределяя InputContext как в примере Virtual Input Panel.
Столкнулся с такой проблемой, что если показывать окно с элементами ввода как модальное, то виртуальная клавиатура не получает эвенты нажатия мыши.

например вот таким образом созданное окно не даст виртуальной клавиатуре работать:
Код:
QInputDialog dlg;
dlg.exec();

Подскажите, как это можно обойти? Возможно ли как то сделать окно виртуальной клавиатуры активным поверх модального?
Записан
yoyo
Гость
« Ответ #1 : Февраль 20, 2012, 15:35 »

Если в примере Virtual Input Panel для MyInputPanel установить атрибут Qt::WA_GroupLeader, то мы заявим, что хотим выдавать клавиатурную панель не только для главного окна, но также для модальных диалоговых окон.
Записан
NeTomat
Гость
« Ответ #2 : Февраль 24, 2012, 13:22 »

Помогло!
Спасибо большое!
Записан
sasha12345
Гость
« Ответ #3 : Июнь 25, 2012, 18:15 »

Я столкнулся с той же проблеммой и Qt::WA_GroupLeader действительно помогает, но в помощи сказано, что этот атрибут устарел и нужно использовать QWidget::windowModality. Но что-то у меня не получается при помощи QWidget::windowModality добиться того же результата, что и с Qt::WA_GroupLeader.
Что делать?
Записан
Kurles
Бывалый
*****
Offline Offline

Сообщений: 480



Просмотр профиля
« Ответ #4 : Июнь 27, 2012, 00:09 »

Я столкнулся с той же проблеммой и Qt::WA_GroupLeader действительно помогает, но в помощи сказано, что этот атрибут устарел и нужно использовать QWidget::windowModality. Но что-то у меня не получается при помощи QWidget::windowModality добиться того же результата, что и с Qt::WA_GroupLeader.
Что делать?
Тоже столкнулся. Надо этот атрибут присваивать не окну, которое будет выскакивать, а модальному окну, поверх которого оно будет выскактвать. Пример для наглядности:
Код
C++ (Qt)
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QDialog>
 
MainWindow::MainWindow(QWidget *parent) :
   QMainWindow(parent),
   ui(new Ui::MainWindow)
{
   ui->setupUi(this);
}
 
MainWindow::~MainWindow()
{
   delete ui;
}
 
void MainWindow::on_pushButton_clicked()
{
   QPushButton *button = new QPushButton("push me plz");
   button->setAttribute(Qt::WA_DeleteOnClose);
   button->setWindowFlags(Qt::Dialog
                          | Qt::WindowSystemMenuHint
                          | Qt::WindowStaysOnTopHint
                          | Qt::CustomizeWindowHint);
   QDialog dlg(this);
   connect(button, SIGNAL(clicked()), &dlg, SLOT(accept()));
   connect(button, SIGNAL(clicked()), button, SLOT(close()));
   button->show();
   dlg.setWindowModality(Qt::WindowModal); // ввод от button не будет заблокирован
   dlg.resize(100,100);
   dlg.exec();
}
 
Записан

Код
C++ (Qt)
while(!asleep()) sheep++;
sasha12345
Гость
« Ответ #5 : Июль 04, 2012, 18:35 »

Спасибо, так тоже работает. Только недостаток в том, что нужно каждому диалоговому окошку выставлять этот атрибут, вместо того, чтобы что-то установить только для виртуальной клавиатуры.
Записан
twp
Гость
« Ответ #6 : Июль 04, 2012, 21:29 »

по идее флаг можно не выставлять, а использовать QDialog::open(), тогда будет использоваться Qt::WindowModal флаг по умолчанию, ну а виртуальную клавиатуру вызывать через QDialog::exec(). Другой вариант - это унаследоваться от QDialog и в конструкторе задавать флаг Qt::WindowModal и тогда можно задействовать QDialog::exec() для своих диалогов.
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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