LINUX.ORG.RU

Два вопроса по qt добавление виртуальной клавиатуры и как сделать невидимую кнопку

 ,


0

1

Я новичок в qt creator и не знаю как правильно добавить виртуальную клавиатуру. Выбрал вот эту https://store.kde.org/p/1132203/ Можете посоветовать что-то другое.

Версия qt4.7.8.

И как можно сделать невидимую активную кнопку на весь экран ? В этот момент на экране будут присутствовать другие виджиты. Когда на нее нажимаешь переходишь во второе окно.

Ответ на: комментарий от anonymous

Вроде добавил все в проект собирается с предупреждениями:

../tion28-pro/softwareinputcontextplugin.cpp: In member function ‘virtual SoftwareInputContext* SoftwareInputContextPlugin::create(const QString&)’:
../tion28-pro/softwareinputcontextplugin.cpp:12:76: warning: unused parameter ‘key’ [-Wunused-parameter]
 SoftwareInputContext *SoftwareInputContextPlugin::create ( const QString & key )
                                                                            ^~~
../tion28-pro/softwareinputcontextplugin.cpp: In member function ‘virtual QString SoftwareInputContextPlugin::description(const QString&)’:
../tion28-pro/softwareinputcontextplugin.cpp:22:67: warning: unused parameter ‘key’ [-Wunused-parameter]
 QString SoftwareInputContextPlugin::description ( const QString & key )
                                                                   ^~~
../tion28-pro/softwareinputcontextplugin.cpp: In member function ‘virtual QString SoftwareInputContextPlugin::displayName(const QString&)’:
../tion28-pro/softwareinputcontextplugin.cpp:31:67: warning: unused parameter ‘key’ [-Wunused-parameter]
 QString SoftwareInputContextPlugin::displayName ( const QString & key )
                                                                   ^~~
../tion28-pro/softwareinputcontextplugin.cpp: In member function ‘virtual QStringList SoftwareInputContextPlugin::languages(const QString&)’:
../tion28-pro/softwareinputcontextplugin.cpp:49:69: warning: unused parameter ‘key’ [-Wunused-parameter]
 QStringList SoftwareInputContextPlugin::languages ( const QString & key )

В общем что сделал: 1. создал виджет add new ---> qt ---> qt designer form class ---> choose ---> widget ---> clase name ---> softwareinputpanel После получил: softwareinputpanel.h softwareinputpanel.cpp softwareinputpanel.ui на форме softwareinputpanel.ui нарисовал произвольно кнопки.

Далее добавил два хидера .h softwareinputcontext.h softwareinputcontextplugin.h

Добавил два .cpp softwareinputcontextplugin.cpp softwareinputcontext.cpp

содержание файлов:

#ifndef SOFTWAREINPUTCONTEXT_H
#define SOFTWAREINPUTCONTEXT_H
#include <QInputContext>

class softwareinputpanel;

class SoftwareInputContext : public QInputContext

{

Q_OBJECT

public:

explicit SoftwareInputContext(QObject *parent = 0);

~SoftwareInputContext();

bool filterEvent(const QEvent* event);

QString identifierName();

QString language();

bool isComposing() const;

void reset();

private slots:

void sendCharacter(QChar character);

private:

void updatePosition();

private:

softwareinputpanel *inputPanel;

};

#endif // SOFTWAREINPUTCONTEXT_H

#ifndef SOFTWAREINPUTCONTEXTPLUGIN_H
#define SOFTWAREINPUTCONTEXTPLUGIN_H

#include <QtGui/QInputContextPlugin>

#include "softwareinputcontext.h"

class SoftwareInputContextPlugin : public QInputContextPlugin {

Q_OBJECT

public:

SoftwareInputContextPlugin(QObject *parent = 0);

SoftwareInputContext *create ( const QString & key );

QString description ( const QString & key );

QString displayName ( const QString & key );

QStringList keys () const;

QStringList languages ( const QString & key );

};

#endif // SOFTWAREINPUTCONTEXTPLUGIN_H

#ifndef SOFTWAREINPUTPANEL_H
#define SOFTWAREINPUTPANEL_H

#include <QWidget>
#include <QSignalMapper>

namespace Ui {
class softwareinputpanel;
}

class softwareinputpanel : public QWidget
{
    Q_OBJECT

public:
    explicit softwareinputpanel(QWidget *parent = 0);
    ~softwareinputpanel();
signals:
 void characterGenerated(QChar character);
protected:
 bool event(QEvent *e);
private slots:
 void saveFocusWidget(QWidget *oldFocus, QWidget *newFocus);
 void buttonClicked(QWidget *w);

private:
    QWidget *lastFocusedWidget;
    QSignalMapper signalMapper;
    Ui::softwareinputpanel *ui;
};

#endif // SOFTWAREINPUTPANEL_H

в .pro

#-------------------------------------------------
#
# Project created by QtCreator 2019-08-10T18:35:24
#
#-------------------------------------------------

QT       += core gui

greaterThan(QT_MAJOR_VERSION, 4): QT += widgets printsupport

TARGET = tion28-pro
TEMPLATE = app

# The following define makes your compiler emit warnings if you use
# any feature of Qt which as been marked as deprecated (the exact warnings
# depend on your compiler). Please consult the documentation of the
# deprecated API in order to know how to port your code away from it.
DEFINES += QT_DEPRECATED_WARNINGS

# You can also make your code fail to compile if you use deprecated APIs.
# In order to do so, uncomment the following line.
# You can also select to disable deprecated APIs only up to a certain version of Qt.
#DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0x060000    # disables all the APIs deprecated before Qt 6.0.0


SOURCES += main.cpp\
        mainwindow.cpp \
    graphwindow.cpp \
    menu_1.cpp \
    edited.cpp \
    softwareinputpanel.cpp \
    softwareinputcontext.cpp \
    softwareinputcontextplugin.cpp

HEADERS  += mainwindow.h \
    graphwindow.h \
    menu_1.h \
    edited.h \
    softwareinputpanel.h \
    softwareinputcontext.h \
    softwareinputcontextplugin.h

FORMS    += mainwindow.ui \
    graphwindow.ui \
    menu_1.ui \
    edited.ui \
    softwareinputpanel.ui

CONFIG += serialport

CONFIG += qwt

CONFIG += plugin
DESTDIR = $$[QT_INSTALL_PLUGINS]/inputmethods

target.path = /home/root
INSTALLS += target

Написал в main

#include "mainwindow.h"
#include <QApplication>
#include <QTextCodec>

#include<softwareinputpanel.h>
#include <QInputContextFactory>

int main(int argc, char *argv[])
{

    QTextCodec::setCodecForLocale(QTextCodec::codecForName("UTF-8"));
    QTextCodec::setCodecForTr(QTextCodec::codecForName("UTF-8"));
    QTextCodec::setCodecForCStrings(QTextCodec::codecForName("UTF-8"));

    QApplication a(argc, argv);

    a.setInputContext(QInputContextFactory::create("softwareinputpanel",&a));

    MainWindow w;
    w.setWindowFlags(Qt::FramelessWindowHint);
    w.show();

    return a.exec();
}

клава не заработала.

Толком не понял что нужно сделать чтобы вызвать клавиатуру ?

Alex_Golubev
() автор топика
Ответ на: комментарий от Alex_Golubev

Толком не понял

Предупреждения тебе прямым текстом говорят, что всё это «добро», что ты добавил в «прожект» не пользуется от слова «совсем». Оно как вариант даже не компилится, а тупо игнорится.

anonymous
()
Ответ на: комментарий от anonymous

Меня за это компилятор ругает


#include "mainwindow.h"
#include <QApplication>
#include <QTextCodec>

#include <softwareinputpanel.h>
#include <QInputContextFactory>


int main(int argc, char *argv[])
{

    QTextCodec::setCodecForLocale(QTextCodec::codecForName("UTF-8"));
    QTextCodec::setCodecForTr(QTextCodec::codecForName("UTF-8"));
    QTextCodec::setCodecForCStrings(QTextCodec::codecForName("UTF-8"));

    QApplication a(argc, argv);

   // a.setInputContext(QInputContextFactory::create("softwareinputpanel",&a));

    //MainWindow w;
    //w.setWindowFlags(Qt::FramelessWindowHint);
    //w.show();

    MainWindow w;
    softwareinputpanel * ic = new softwareinputpanel();
    a.setInputContext(ic);
    w.show();

    return a.exec();
}

../tion28-pro/main.cpp: In function ‘int main(int, char**)’:
../tion28-pro/main.cpp:26:25: error: no matching function for call to ‘QApplication::setInputContext(softwareinputpanel*&)’
     a.setInputContext(ic);
                         ^
In file included from ../work1/buildroot/output/host/arm-buildroot-linux-uclibcgnueabi/sysroot/usr/include/QtGui/QApplication:1:0,
                 from ../tion28-pro/main.cpp:2:
../work1/buildroot/output/host/arm-buildroot-linux-uclibcgnueabi/sysroot/usr/include/QtGui/qapplication.h:281:10: note: candidate: void QApplication::setInputContext(QInputContext*)
     void setInputContext(QInputContext *);
          ^~~~~~~~~~~~~~~
../work1/buildroot/output/host/arm-buildroot-linux-uclibcgnueabi/sysroot/usr/include/QtGui/qapplication.h:281:10: note:   no known conversion for argument 1 from ‘softwareinputpanel*’ to ‘QInputContext*’
Alex_Golubev
() автор топика
Ответ на: комментарий от anonymous

Сделал вот так и все равно не чего не заработало

#include "mainwindow.h"
#include <QApplication>
#include <QTextCodec>

#include <softwareinputpanel.h>
#include <softwareinputcontext.h>
#include <QInputContextFactory>


int main(int argc, char *argv[])
{

    QTextCodec::setCodecForLocale(QTextCodec::codecForName("UTF-8"));
    QTextCodec::setCodecForTr(QTextCodec::codecForName("UTF-8"));
    QTextCodec::setCodecForCStrings(QTextCodec::codecForName("UTF-8"));

    QApplication a(argc, argv);

   // a.setInputContext(QInputContextFactory::create("softwareinputpanel",&a));

    //MainWindow w;
    //w.setWindowFlags(Qt::FramelessWindowHint);
    //w.show();

    MainWindow w;
    SoftwareInputContext * ic = new SoftwareInputContext();
    a.setInputContext(ic);
    w.show();

    return a.exec();
}
Alex_Golubev
() автор топика
Ответ на: комментарий от Alex_Golubev

Но после прочтения остался вопрос, можно сделать эту панель общую для всех forms? Ну чтобы можно было тыкнуть пальцем в edited и панель всплыла после завершения набора можно было ее убрать.

Оно по идее только в пределах одного приложения работает. Тебе так и надо? Если тебе нужна System Wide Virtual Keyboard то тебе нужно смотреть в сторону https://doc.qt.io/archives/qt-4.8/qt-embedded-charinput.html, так как на Embedded всё упирается в QWS от Qt 4.

А если обычная виртуальная клавиатура в пределах одного приложения – самый простой способ это самописный костыль - окошко с кнопками, вызываемое при клике на контролл ввода информации.

EXL ★★★★★
()
Ответ на: комментарий от anonymous

мне Вот что интересно можно сделать так чтобы клава переключалась с английского на русский и с символов на цифры?

Alex_Golubev
() автор топика
Ответ на: комментарий от Alex_Golubev

Я бы вообще сделал свою реализацию клавиатуры с цикличным переключением en/ru/sym/123.

EXL ★★★★★
()
Ответ на: комментарий от anonymous

у меня почему то не вызывается метод на закрытие клавиатуры

bool SoftwareInputContext::filterEvent(const QEvent* event)
{
if (event->type() == QEvent::RequestSoftwareInputPanel) {
    updatePosition();
    inputPanel->show();
    return true;
} else if (event->type() == QEvent::CloseSoftwareInputPanel) {
    inputPanel->hide();
    return true;
}
return false;
}
Тыкаю пальцем в место где нет texteditor и клава не закрывается. Хотя если взять китайский проект то все работает.

Alex_Golubev
() автор топика
Ответ на: комментарий от anonymous

Я запустил программу в отладчики, поставил брик поинт в


bool SoftwareInputContext::filterEvent(const QEvent* event)
{
*   if (event->type() == QEvent::RequestSoftwareInputPanel) {
    updatePosition();
    inputPanel->show();
    return true;
} else if (event->type() == QEvent::CloseSoftwareInputPanel) {
    inputPanel->hide();
    return true;
}
return false;
}

* брик поинт

когда нажимаешь в область line edit то программа останавливается на брик поинт, а когда нажимаешь в область экрана где нет ни чего то брик поинт не вызывается.

Alex_Golubev
() автор топика
Ответ на: комментарий от Alex_Golubev

а когда нажимаешь в область

Ну ещё бы! Это ж метод твоего SoftwareInputContext, ни грамма не всего остального.

anonymous
()
Ответ на: комментарий от anonymous

Уверен. В китайской клавиатуре (ту которую ты мне дал) работает. Когда тыкаешь в свободную область экрана клава закрывается. И вызов CloseSoftwareInputPanel происходит. Я же скопировал .h и .cpp SoftKeyBoardContext и не чего не заработало. Где ошибка мне не ясно

Alex_Golubev
() автор топика
Ответ на: комментарий от Alex_Golubev

мне не ясно

На:

void SoftKeyBoard::mousePressEvent(QMouseEvent *event)
bp поставь и пошагово, пошагово... Тогда мож станет ясно.

anonymous
()
Ответ на: комментарий от anonymous

Это событие вызывает когда нажимаешь на кнопку клавиатуры. И не только эти события но и void mouseMoveEvent(QMouseEvent *event); void mouseReleaseEvent(QMouseEvent *event);

В сдобное место экрана такаешь и событие не вызывается.

Alex_Golubev
() автор топика
Ответ на: комментарий от Alex_Golubev

В сдобное место экрана

Значит тебе нужно другое событие, например, тыканье по основному (не клаве) окну.

anonymous
()
Ответ на: комментарий от Alex_Golubev

Не понял

Я не телепат и твои «дела» не вижу. По твоему описанию у тебя 2 окна: основное и клава.

anonymous
()
Ответ на: комментарий от anonymous

Да все правильно. Я новичок пришел из программирование Микропроцессоров (там тоже с++ но другой) поэтому некоторые термины не знаю еще.

Alex_Golubev
() автор топика
Ответ на: комментарий от Alex_Golubev

пришел из программирование Микропроцессоров

Зачем ушёл то? Ради убогих «окошечков»? Да ты не в себе.

anonymous
()
Ответ на: комментарий от anonymous

Я не ушел также программирую и схемы рисую и платы. Просто на ARM научился LINUX ставить. А Писать программы еще нет. Вот хочу освоить так сказать. Буду совсем молодец :).

Да у китайца из главного меню клава закрывается.

Alex_Golubev
() автор топика
Ответ на: комментарий от Alex_Golubev

Да у китайца из главного меню клава закрывается.

Зачем тебе «меню»? Сделай какую-нибудь закорючку (кнопку), либо пользуй какой-нибудь другой event, что-нибудь из {focus}.

anonymous
()
Ответ на: комментарий от Alex_Golubev

Можешь посмотреть у себя в чем хитрость? Ну из всех окон у китайца вызывается CloseSoftwareInputPanel а у меня нет.

Alex_Golubev
() автор топика
Ответ на: комментарий от Alex_Golubev

Я имею в виду посмотреть проект клавиатуры китайца.

Гениально! Так держать. Не волнуйтесь, с Вами свяжутся...

anonymous
()
Ответ на: комментарий от anonymous

Я когда копирую в ui клавы

  <connection>
   <sender>btn_close_</sender>
   <signal>clicked()</signal>
   <receiver>SoftKeyBoard</receiver>
   <slot>hide()</slot>
   <hints>
    <hint type="sourcelabel">
     <x>114</x>
     <y>209</y>
    </hint>
    <hint type="destinationlabel">
     <x>83</x>
     <y>116</y>
    </hint>
   </hints>
  </connection>
 </connections>

у меня программа выдает ошибку :-1: error: [ui_softwareinputpanel.h] Error 1

Alex_Golubev
() автор топика
Ответ на: комментарий от anonymous

Вот задача а как редактировать ui файл. Я открыл в блокноте ввел данные сохранил. Открыл в qt creator а там старые данные.

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