Как можно разместить виджет клавиатуры строго в границах дисплея (экрана)
Сделал виртуальную клавиатуры опираясь на статью http://qt.e-werest.org/node/2939.
Возникла проблема: виджеты QInputText, QTextEdit и QPlaintTextEdit находятся ближе к левому, или к правому краю экрана, клавиатура просто не помещается в размер дисплея.
Хочется, чтобы границы клавиатуры всегда были в пределах экрана.
Для обновления позиции клавиатуры вызывается метод:
void SoftKeyBoardContext::updatePosition()
{
QWidget *widget = focusWidget();
if (!widget)
return;
keyboard_->move(widget->mapToGlobal(QPoint(widget->rect().left(), widget->rect().bottom()))); // как можно наложить пределы на x,y перемещения клавиатуры?
}
Ответы (1 шт):
Метод QApplication::primaryScreen возвращает указатель на объект QScreen, соответствующего главному экрану системы и он (объект QScreen), в свою очередь, кроме всего прочего, содержит геометрические размеры экрана:
QStreen* screen = QApplication::primaryScreen();
// Получаем геометрию экрана. Например (0, 0, 640, 480)
QRect rect = screen->geometry();
// Виртуальная геометрия экрана вернет смещение относительно других экранов системы. Например, для второго экрана (640, 0, 640, 480)
QRect rect = screen->virtualGeometry();
Далее, если у вас есть какой-нибудь виджет со своей геометрией, то вы можете проверять выходят ли размеры (высота, или ширина) этого виджета за пределы размеров экрана.
Если выходят, - то изменять выходящий за пределы размер и пропорционально (с помощью множителя) изменять смежный (высоту, или ширину), тем самым добиться нужного результата.
В вашем случае, как мне кажется, все еще проще, например, необходимо, чтобы панель клавиатуры не превышала по высоте половину экрана (у нас это 240 точек), соответственно, до показа панели (где-нибудь заранее, в конструкторе) задаем ей высоту (максимум и минимум) 240px и, соответственно, ширину, либо пропорционально, либо, что лучше, во всю ширину экрана, левый верхний угол в точку (0, 240px), а на самой панеле, в центре, разместить все управляющие контролы.
