Как можно разместить виджет клавиатуры строго в границах дисплея (экрана)

Сделал виртуальную клавиатуры опираясь на статью 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 шт):

Автор решения: Alexander Chernin

Метод 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), а на самой панеле, в центре, разместить все управляющие контролы.

введите сюда описание изображения

→ Ссылка