#include "InputObject.h" #include "ui_inputobject.h" //#include "qdesktopwidget.h" #include #include #include #include #include #include #include #include InputObject::InputObject(QWidget *parent) : QWidget(parent), ui(new Ui::InputObject) { ui->setupUi(this); initUi(); this->setVisible(false); this->setWindowFlags(Qt::Tool | Qt::FramelessWindowHint); } InputObject::~InputObject() { delete ui; } void InputObject::initUi() { //#3c3c3c // QString style = "QWidget#WiBack{background-image: url(:/icons/bg.jpeg);}" "QWidget#WiBo{background-color: black;}" "QLineEdit,QDateEdit{background-color: rgba(0,0,0,0.5);\ min-height:100px;max-height:100px; min-width:500px;max-width:500px;\ border: 2px solid #ef9cba; border-radius:20px;\ font-family:Arial; color:white;margin:0;font-size:36px;}" "QTextEdit{background-color: rgba(0,0,0,0.5);\ min-height:300px;max-height:300px; min-width:700px;max-width:700px;\ border: 2px solid #ef9cba; border-radius:20px;\ font-family:Arial; color:white;margin:0;font-size:36px;}" "QDateEdit::up-button{image: url(:/up.png);height:15px;}" "QDateEdit::down-button{image:url(:/down.png);height:15px;}" ; setStyleSheet(style); ui->dateEdit->setVisible(false); ui->dateEdit->setMaximumDate(QDate::currentDate()); ui->dateEdit->setDisplayFormat("yyyy/MM/dd"); ui->dateEdit->setStyleSheet(style); //this->setWindowOpacity(0.8); connect(QGuiApplication::inputMethod(), &QInputMethod::visibleChanged, [=]() { if (QGuiApplication::inputMethod()->isVisible())return; //qDebug() << "HidePanel"; //qDebug() << "focusWidget" << qApp->focusWidget(); this->HidePanel(); this->hide(); }); } bool InputObject::eventFilter(QObject *obj, QEvent *event) { //mouse button release means setfocus is useless if (event->type() == QEvent::MouseButtonRelease) { //qDebug() << obj << event->type(); if (obj->objectName() == QString("qt_spinbox_lineedit")) { QDateEdit *_date = qobject_cast(obj->parent()); if (_date == ui->dateEdit)return true; if (_date->isEnabled()) { this->ShowPanel(); return true; } } if (obj->objectName() == QString("qt_scrollarea_viewport")) { QTextEdit *_text= qobject_cast(obj->parent()); if (!_text) return false; if (_text == ui->textEdit) return true; // if (_text->isEnabled()) { this->ShowPanel(); return true; } } if (obj->inherits("QLineEdit")) { QLineEdit *tbx = qobject_cast(obj); //you have to tell whether it is coming from qdateedit!!! if (ui->lineEdit != tbx && tbx->isEnabled()) { //qDebug() << "ShowPanel"; //qDebug() << "focusWidget" << qApp->focusWidget(); //qDebug() << "lineEdit" << ui->lineEdit; //qDebug() << "obj" << obj; this->ShowPanel(); return true; } } } return QObject::eventFilter(obj, event); } void InputObject::ShowPanel() { if (qApp->focusWidget()->inherits("QLineEdit")) { curLine = qobject_cast(qApp->focusWidget()); ui->dateEdit->setVisible(false); ui->lineEdit->setVisible(true); ui->textEdit->setVisible(false); } if (qApp->focusWidget()->inherits("QDateEdit")) { curDateEdit = qobject_cast(qApp->focusWidget()); ui->dateEdit->setVisible(true); ui->lineEdit->setVisible(false); ui->textEdit->setVisible(false); } if (qApp->focusWidget()->inherits("QTextEdit")) { curText = qobject_cast(qApp->focusWidget()); ui->dateEdit->setVisible(false); ui->lineEdit->setVisible(false); ui->textEdit->setVisible(true); } //else //{ // return; //} //QDesktopWidget w; //int deskWidth = w.availableGeometry().width(); //int deskHeight = w.availableGeometry().height(); //int vkbHeight = QGuiApplication::inputMethod()->keyboardRectangle().height(); this->showFullScreen(); this->setVisible(true); this->activateWindow(); //it is quite important!!! if (curLine) { ui->lineEdit->setText(curLine->text()); ui->lineEdit->setEchoMode(curLine->echoMode()); ui->lineEdit->setInputMethodHints(Qt::InputMethodHint::ImhNoAutoUppercase); //qDebug() << "begin"; ui->lineEdit->setFocus(); //QFocusEvent event0(QEvent::FocusIn); //QCoreApplication::sendEvent(ui->lineEdit, &event0); while (QGuiApplication::focusObject() != ui->lineEdit) { qApp->processEvents(); } //qDebug() << QGuiApplication::focusObject(); QEvent event(QEvent::RequestSoftwareInputPanel); QCoreApplication::sendEvent(ui->lineEdit, &event); // QMouseEvent pressed(QEvent::MouseButtonPress, QPointF(10,10),Qt::LeftButton, Qt::LeftButton,Qt::NoModifier); // QApplication::sendEvent(ui->lineEdit, &pressed); // qDebug()<<"release"; // QMouseEvent release(QEvent::MouseButtonRelease, QPointF(10,10),Qt::LeftButton, Qt::LeftButton,Qt::NoModifier); // QApplication::sendEvent(ui->lineEdit, &release); // qDebug() <dateEdit->setDateTime(curDateEdit->dateTime()); ui->dateEdit->setFocus(); while (QGuiApplication::focusObject() != ui->dateEdit) { qApp->processEvents(); } qDebug() << QGuiApplication::focusObject(); QEvent event(QEvent::RequestSoftwareInputPanel); QCoreApplication::sendEvent(ui->dateEdit, &event); } if (curText) { ui->textEdit->setPlainText(curText->toPlainText()); ui->textEdit->setFocus(); while (QGuiApplication::focusObject() != ui->textEdit) { qApp->processEvents(); } //qDebug() << QGuiApplication::focusObject(); QEvent event(QEvent::RequestSoftwareInputPanel); QCoreApplication::sendEvent(ui->textEdit, &event); } } void InputObject::HidePanel() { if (curLine) { curLine->setText(ui->lineEdit->text()); ui->lineEdit->clearFocus(); ui->lineEdit->clear(); //this->setVisible(false); curLine = nullptr; } else if (curDateEdit) { //curDateEdit->setDateTime(QDateTime::currentDateTime()); curDateEdit->setDateTime(ui->dateEdit->dateTime()); ui->dateEdit->clearFocus(); ui->dateEdit->clear(); //this->setVisible(false); curDateEdit = nullptr; } else if (curText) { curText->setText(ui->textEdit->toPlainText()); ui->textEdit->clearFocus(); ui->textEdit->clear(); //this->setVisible(false); curText = nullptr; } else { return; } }