2013-09-24 131 views
6

Tôi muốn tạo bàn phím ảo cho ứng dụng dành cho máy tính để bàn. Các ứng dụng sẽ được xây dựng trong Qt 5. Tôi có vài câu hỏi, xin vui lòng làm rõ chúng.Bàn phím ảo trên màn hình Qt 5

  1. Thay thế QInputContext trong Qt5 là gì? (Bởi vì tôi đọc ở đâu đó về Bàn phím trên màn hình bằng cách thực hiện QInputContext nhưng điều này không được hỗ trợ bởi Qt 5.)

  2. Tôi có thể tìm QPlateformInputContext & QInputPanel (trên một tìm kiếm internet tôi tìm thấy hai là lựa chọn thay thế của QInputContext nhưng không chắc chắn về điều đó và tôi cũng không thể tìm thấy chúng)?

yêu cầu của tôi:

  1. Keyboard sẽ không sử dụng QML hoặc bất kỳ thư viện bên ngoài (đã xây dựng bàn phím khác)
  2. Bàn phím sẽ sử dụng Qt Gui (truyền thống)

Trả lời

0

tôi đưa tôi nhiều thời gian để tìm hiểu làm thế nào để làm điều này trong QT5 không qml và quá nhiều việc. Vì vậy, nghĩ rằng tôi muốn chia sẻ:

#include <QCoreApplication> 
#include <QGuiApplication> 
#include <QKeyEvent> 

void MainWindow::on_pushButton_clicked() 
{ 
    Qt::Key key = Qt::Key_1;; 

    QKeyEvent pressEvent = QKeyEvent(QEvent::KeyPress, key, Qt::NoModifier, QKeySequence(key).toString()); 
    QKeyEvent releaseEvent = QKeyEvent(QEvent::KeyRelease, key, Qt::NoModifier); 
    QCoreApplication::sendEvent(QGuiApplication::focusObject(), &pressEvent); 
    QCoreApplication::sendEvent(QGuiApplication::focusObject(), &releaseEvent); 
} 

Các đầu mối ở đây là bằng cách nhấn vào nút (nếu bạn tự sẽ làm cho bàn phím của bạn), ra mắt một sendevent đến đối tượng hiện thas có trọng tâm (ví dụ như một hộp). Tất nhiên, bạn có thể mã hóa một hộp văn bản, nhưng nó chỉ hoạt động nếu bạn chỉ có một đầu vào duy nhất để sử dụng bàn phím của mình.

Điều cuối cùng bạn phải đảm bảo, là đặt focusPolicy của các nút bàn phím thành NoFocus, để tránh lấy nét khi dịch chuyển khi bàn phím được nhấn.

Tín dụng chuyển đến https://www.wisol.ch/w/articles/2015-07-26-virtual-keyboard-qt/

Hy vọng điều này sẽ giúp ai đó.

2

Tôi hiểu có hai thách thức bạn sẽ có:

  1. Bắt được thông báo như khi để hiển thị/ẩn bàn phím trên màn hình, dựa trên sự tập trung là trên widget văn bản
  2. Làm thế nào để gửi sự kiện quan trọng thao tác bấm vào widget văn bản

ĐÁP

  1. Như trước đây, bạn có thể sử dụng QObject::InstallEventFilter() trên các tiện ích mà bạn muốn cung cấp dịch vụ bàn phím. Sau đó, bạn có thể tìm kiếm mouseReleaseEvent dọc theo các dòng mã Qt trong liên kết.
  2. này có thể đạt được bằng cách sử dụng QCoreApplication::postEvent()

Đối với QPlatformInputContext, lấy ví dụ về một Qt Virtual Keyboard đây.

+1

Để tự động ẩn, tôi đã sử dụng tín hiệu FocusChanged (QWidget * old, QWidget * new) của QApplication.for đặt văn bản trong QLineEdit/QTextEdit, tôi đã đăng sự kiện quan trọng trong khe được kết nối với nút bấm tín hiệu của nút bàn phím. Vì vậy, không cần phải viết thêm cho text.It đầu vào là làm việc tốt và nó là chung quá. – Jai

0

Tôi vừa làm việc này trong ứng dụng Qt tuyệt vời của mình. Đây là cách tôi đã làm nó.

Đối với Android và iOS:

QObject::connect(lineEdit, SIGNAL(returnPressed()), qApp->inputMethod(), SLOT(hide())); 

Đối với iOS:

Subclass QLineEdit và thêm dòng sau:

void focusOutEvent(QFocusEvent * fe) 
{ 
    QLineEdit::focusOutEvent(fe); 
#ifdef Q_OS_IOS 
    if(fe->reason() == Qt::OtherFocusReason) 
    { 
     // Done was pressed! 
     emit returnPressed(); 
    } 
#endif 
} 

Btw, các tài liệu QInputMethod không nói nhiều về làm thế nào để truy cập nó từ C++. Bạn phải lấy một cá thể từ QGuiApplication, như tôi đã làm ở trên.

Hy vọng điều đó sẽ hữu ích.

1

Bây giờ Qt cung cấp khung bàn phím ảo trong Qt 5.5.

http://doc.qt.io/QtVirtualKeyboard/

Tôi đã không thử nó, vì vậy tôi không thể nói như thế nào dễ dàng để sử dụng. Dường như nó dựa trên QML.

(Nó nói nó là dành cho Linux và boot2qt, nhưng nó cũng có thể được xây dựng cho Windows theo trang xây dựng (http://doc.qt.io/QtVirtualKeyboard/build.html))

+2

Cần lưu ý rằng QtVirtualKeyboard được cấp phép thương mại hoặc thông qua GPL, khác với phần còn lại của Qt, có thể khiến mọi người không sử dụng nó. – FourtyTwo