LINUX.ORG.RU

QWidget, showFullScreen()


0

2

Доброго времени суток.

Есть виджет, который в определенное время должен занять весь экран, без заголовка, закрыть все панели (как полноэкранный режим в в огнелисе, например). showFullScreen() подходит, но за одним исключением: это виджет должен уметь показывать экранную клавиатуру(использую matchbox-keyboard), и в таком режиме ее как раз не видно. Пробую в убунте: metacity или compiz - одинаково. Как научить клавиатуру показываться перед виджетом?

Клавиатуру показываю/скрываю по тупому - старт/стоп процесса. Она умеет запускаться в режиме демона, но как ей управлять - хз. В гугле не нашел.

Ответ на: комментарий от mr-badguy

Продолжаю изыскания по поводу как подружить QWidget (showFullScreen или Qt::FramelessWindowHint) c matchbox-keyboard:

Запуск клавиатуры осуществляю из метода eventFilter() сабкласса QInputContext:

bool InputContext::filterEvent(const QEvent *event)
{
    QPointer<QWidget> w = focusWidget();
    if (event->type() == QEvent::RequestSoftwareInputPanel) {
        qDebug() << "RequestSoftwareInputPanel";
        //m_vkbd->show();
        m_ip->show();
        return true;
    } else if (event->type() == QEvent::CloseSoftwareInputPanel) {
        qDebug() << "CloseSoftwareInputPanel";
        //m_vkbd->hide();
        m_ip->hide();
        return true;
    } 
    return false;
}

1 - m_ip - подкласс QX11EmbedContainer.

Итог: контейнер с клавиатурой не показывается, даже если сказать ему Qt::WindowStaysOnTopHint, Кроме того, если даже главный виджет не в полноэкранном режиме, то при показе клавиатуры теряется фокус у поля ввода главного виджета.

2 - m_vkbd - обертка над QProcess (mathcbox-keyboard) matchbox-keyboard запускается с параметром -xid, запоминаем win id;

void VkbdWrapper::show()
{
    QStringList args;
    args << "-i" << "-a" << QString::number(m_wid); 
    QProcess::execute( "wmctrl", args );
    
    args.clear();
    QRect r = qApp->desktop()->screenGeometry();
    qDebug() << "screen: " << r;
    r.setTop(r.height() * 3 / 4);
    
    args << "-i" << "-r" << QString::number(m_wid) << "-e" << QString("0,%1,%2,%3,%4").arg(r.x()).arg(r.top()).
        arg(r.width()).arg(r.height());
    QProcess::execute( "wmctrl", args );
    args.clear();
    args << "-i" << "-r" << QString::number(m_wid) << "-b" << "toggle,above"; 
    QProcess::execute( "wmctrl", args );
}

Клавиатура показыавается, но а) при нажатии на клавиатуру теряется фокус главного виджета; б) окно клавиатуры имеет заголовок;

Никто не знает менее извратный способ подружить matchbox-keyboard и QWidget в фулскрине?

matchbox-keyboard может запускаться с клюем -d и после этого замечательно всплывает, например при появлении фокуса в адрес-бар файрфокса, но не хочет всплывать при появлении фокуса в Qt виджете.

mr-badguy ()
Ответ на: комментарий от mr-badguy

Хм, может надобно заставить себя написать вирт. клавиатуру, как класс QWidget?
Иначе работоспособность этого всего будет зависеть от wm.

blinkenlichten ()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.