Keyboard 无法从Qwidget向主窗口发送信号
我曾经编写过一个虚拟键盘应用程序。我对它做了一些修改,接受退格、左键等。 我想做的是从输入面板窗体向主窗口发送一个信号(enterKeyGenerated)。但我没有这样做。这是我的密码: MyInputPanel.cpp(已编辑) MyInputPanelContext.cpp:Keyboard 无法从Qwidget向主窗口发送信号,keyboard,qt4,virtual,Keyboard,Qt4,Virtual,我曾经编写过一个虚拟键盘应用程序。我对它做了一些修改,接受退格、左键等。 我想做的是从输入面板窗体向主窗口发送一个信号(enterKeyGenerated)。但我没有这样做。这是我的密码: MyInputPanel.cpp(已编辑) MyInputPanelContext.cpp: #include <QtCore> #include "myinputpanelcontext.h" MyInputPanelContext::MyInputPanelContext() {
#include <QtCore>
#include "myinputpanelcontext.h"
MyInputPanelContext::MyInputPanelContext()
{
inputPanel = new MyInputPanel;
connect(inputPanel,SIGNAL(characterGenerated(QChar)), SLOT(sendCharacter(QChar)));
connect(inputPanel,SIGNAL(bckSpcKeyGenerated()),SLOT(sendBackSpaceKey()));
connect(inputPanel,SIGNAL(leftKeyGenerated()),SLOT(sendLeftKey()));
connect(inputPanel,SIGNAL(rightKeyGenerated()),SLOT(sendRightKey()));
connect(inputPanel,SIGNAL(enterKeyGenerated()),SLOT(sendEnterKey()));
connect(inputPanel,SIGNAL(closeKeyGenerated()),SLOT(sendCloseKey()));
connect(inputPanel,SIGNAL(f1KeyGenerated()),SLOT(sendF1Key()));
}
MyInputPanelContext::~MyInputPanelContext()
{
delete inputPanel;
}
bool MyInputPanelContext::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;
}
. . .
void MyInputPanelContext::sendCharacter(QChar character)
{
QPointer<QWidget> w = focusWidget();
if (!w)
return;
QKeyEvent keyPress(QEvent::KeyPress, character.unicode(), Qt::NoModifier, QString(character));
if (!w)
return;
QKeyEvent keyRelease(QEvent::KeyPress, character.unicode(), Qt::NoModifier, QString());
QApplication::sendEvent(w, &keyRelease);
}
void MyInputPanelContext::sendBackSpaceKey()
{
if(!focusWidget()) return;
QKeyEvent delPress(QEvent::KeyPress, Qt::Key_Backspace, Qt::NoModifier);
QApplication::sendEvent(focusWidget(), &delPress);
QKeyEvent delRelease(QEvent::KeyRelease, Qt::Key_Backspace, Qt::NoModifier);
QApplication::sendEvent(focusWidget(), &delRelease);
}
void MyInputPanelContext::sendRightKey()
{
if(!focusWidget())return;
QKeyEvent rightKeyPress(QEvent::KeyPress,Qt::Key_Right,Qt::NoModifier);
QApplication::sendEvent(focusWidget(), &rightKeyPress);
QKeyEvent rightKeyRelease(QEvent::KeyRelease, Qt::Key_Right, Qt::NoModifier);
QApplication::sendEvent(focusWidget(), &rightKeyRelease);
}
void MyInputPanelContext::sendLeftKey()
{
if(!focusWidget()) return;
QKeyEvent leftKeyPress(QEvent::KeyPress,Qt::Key_Left,Qt::NoModifier);
QApplication::sendEvent(focusWidget(), &leftKeyPress);
QKeyEvent leftKeyRelease(QEvent::KeyRelease, Qt::Key_Left, Qt::NoModifier);
QApplication::sendEvent(focusWidget(), &leftKeyRelease);
}
void MyInputPanelContext::sendEnterKey()
{
if(!focusWidget()) return;
QKeyEvent delPress(QEvent::KeyPress, Qt::Key_Enter, Qt::NoModifier);
QApplication::sendEvent(focusWidget(), &delPress);
QKeyEvent delRelease(QEvent::KeyRelease, Qt::Key_Enter, Qt::NoModifier);
QApplication::sendEvent(focusWidget(), &delRelease);
}
void MyInputPanelContext::sendCloseKey()
{
if(!focusWidget()) return;
QKeyEvent delPress(QEvent::KeyPress, Qt::Key_Close, Qt::NoModifier);
QApplication::sendEvent(focusWidget(), &delPress);
QKeyEvent delRelease(QEvent::KeyRelease, Qt::Key_Close, Qt::NoModifier);
QApplication::sendEvent(focusWidget(), &delRelease);
}
void MyInputPanelContext::sendF1Key()
{
if(!focusWidget()) return;
QKeyEvent delPress( QEvent::KeyPress, Qt::Key_F1, Qt::NoModifier);
QApplication::sendEvent(focusWidget(), &delPress);
QKeyEvent delRelease(QEvent::KeyRelease, Qt::Key_F1, Qt::NoModifier);
QApplication::sendEvent(focusWidget(), &delRelease);
}
void MyInputPanelContext::updatePosition()
{
QWidget *widget = focusWidget();
if (!widget)
return;
QRect widgetRect = widget->rect();
QPoint panelPos = QPoint(widgetRect.left(), widgetRect.bottom()+ 2);//
panelPos = widget->mapToGlobal(panelPos);
inputPanel->move(panelPos);
}
#包括
#包括“myinputpanelcontext.h”
MyInputPanelContext::MyInputPanelContext()
{
inputPanel=新的MyInputPanel;
连接(输入面板、信号(characterGenerated(QChar))、插槽(sendCharacter(QChar));
连接(inputPanel,信号(bckSpcKeyGenerated()),插槽(sendBackSpaceKey());
连接(输入面板,信号(leftKeyGenerated()),插槽(sendLeftKey());
连接(输入面板,信号(rightKeyGenerated()),插槽(sendRightKey());
连接(输入面板,信号(enterKeyGenerated()),插槽(sendEnterKey());
连接(输入面板,信号(closeKeyGenerated()),插槽(sendCloseKey());
连接(输入面板,信号(f1KeyGenerated()),插槽(sendF1Key());
}
MyInputPanelContext::~MyInputPanelContext()
{
删除输入面板;
}
bool MyInputPanelContext::filterEvent(常量QEvent*事件)
{
如果(事件->类型()==QEvent::RequestSoftwareInputPanel)
{
updatePosition();
输入面板->显示();
返回true;
}
else if(事件->类型()==QEvent::CloseSoftwareInputPanel)
{
输入面板->隐藏();
返回true;
}
返回false;
}
. . .
void MyInputPanelContext::sendCharacter(QChar字符)
{
QPointer w=focusWidget();
如果(!w)
返回;
QKeyEvent-keyPress(QEvent::keyPress,character.unicode(),Qt::NoModifier,QString(character));
如果(!w)
返回;
QKeyEvent keyRelease(QEvent::KeyPress,character.unicode(),Qt::NoModifier,QString());
QApplication::sendEvent(带和键释放);
}
void MyInputPanelContext::sendBackSpaceKey()
{
如果(!focusWidget())返回;
QKeyEvent-delPress(QEvent::KeyPress,Qt::Key_Backspace,Qt::NoModifier);
QApplication::sendEvent(focusWidget(),&delPress);
QKeyEvent delRelease(QEvent::KeyRelease,Qt::Key_Backspace,Qt::NoModifier);
QApplication::sendEvent(focusWidget(),&delRelease);
}
void MyInputPanelContext::sendRightKey()
{
如果(!focusWidget())返回;
QKeyEvent rightKeyPress(QEvent::KeyPress,Qt::Key_Right,Qt::NoModifier);
QApplication::sendEvent(focusWidget(),&rightKeyPress);
QKeyEvent rightKeyRelease(QEvent::KeyRelease,Qt::Key_Right,Qt::NoModifier);
QApplication::sendEvent(focusWidget(),&rightKeyRelease);
}
void MyInputPanelContext::sendLeftKey()
{
如果(!focusWidget())返回;
QKeyEvent leftKeyPress(QEvent::KeyPress,Qt::Key_Left,Qt::NoModifier);
QApplication::sendEvent(focusWidget(),&leftKeyPress);
QKeyEvent leftKeyRelease(QEvent::KeyRelease,Qt::Key_Left,Qt::NoModifier);
QApplication::sendEvent(focusWidget(),&leftKeyRelease);
}
void MyInputPanelContext::sendEnterKey()
{
如果(!focusWidget())返回;
QKeyEvent delPress(QEvent::KeyPress,Qt::Key_Enter,Qt::NoModifier);
QApplication::sendEvent(focusWidget(),&delPress);
QKeyEvent delRelease(QEvent::KeyRelease,Qt::Key_Enter,Qt::NoModifier);
QApplication::sendEvent(focusWidget(),&delRelease);
}
void MyInputPanelContext::sendCloseKey()
{
如果(!focusWidget())返回;
QKeyEvent delPress(QEvent::KeyPress,Qt::Key_Close,Qt::NoModifier);
QApplication::sendEvent(focusWidget(),&delPress);
QKeyEvent delRelease(QEvent::KeyRelease,Qt::Key_Close,Qt::NoModifier);
QApplication::sendEvent(focusWidget(),&delRelease);
}
void MyInputPanelContext::sendF1Key()
{
如果(!focusWidget())返回;
QKeyEvent delPress(QEvent::KeyPress,Qt::Key_F1,Qt::NoModifier);
QApplication::sendEvent(focusWidget(),&delPress);
QKeyEvent delRelease(QEvent::KeyRelease,Qt::Key_F1,Qt::NoModifier);
QApplication::sendEvent(focusWidget(),&delRelease);
}
void MyInputPanelContext::updatePosition()
{
QWidget*widget=focusWidget();
如果(!小部件)
返回;
QRect-widgetRect=widget->rect();
QPoint panelPos=QPoint(widgetRect.left(),widgetRect.bottom()+2)//
panelPos=widget->mapToGlobal(panelPos);
输入面板->移动(面板位置);
}
在这里,它必须显示一个带有文本“yyayy”的messagesbox。
但什么也没发生。
请帮我找出我做错了什么。谢谢。您需要发出信号
rightKeyGenerated()
,该信号与setToDefault()插槽连接
您的代码中没有发射
MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MainWindow)
{
ui->setupUi(this);
. . .
inputPanel = new MyInputPanel;
connect(inputPanel,SIGNAL(rightKeyGenerated()),this,SLOT(setToDefault()));
. . .
}
void MainWindow::setToDefault()
{
QMessageBox q;
q.setText("yyayyy");
q.exec();
connect(ui->comboBox, SIGNAL(currentIndexChanged(int)), this, SLOT(test(int)));
}
#include <QtCore>
#include "myinputpanelcontext.h"
MyInputPanelContext::MyInputPanelContext()
{
inputPanel = new MyInputPanel;
connect(inputPanel,SIGNAL(characterGenerated(QChar)), SLOT(sendCharacter(QChar)));
connect(inputPanel,SIGNAL(bckSpcKeyGenerated()),SLOT(sendBackSpaceKey()));
connect(inputPanel,SIGNAL(leftKeyGenerated()),SLOT(sendLeftKey()));
connect(inputPanel,SIGNAL(rightKeyGenerated()),SLOT(sendRightKey()));
connect(inputPanel,SIGNAL(enterKeyGenerated()),SLOT(sendEnterKey()));
connect(inputPanel,SIGNAL(closeKeyGenerated()),SLOT(sendCloseKey()));
connect(inputPanel,SIGNAL(f1KeyGenerated()),SLOT(sendF1Key()));
}
MyInputPanelContext::~MyInputPanelContext()
{
delete inputPanel;
}
bool MyInputPanelContext::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;
}
. . .
void MyInputPanelContext::sendCharacter(QChar character)
{
QPointer<QWidget> w = focusWidget();
if (!w)
return;
QKeyEvent keyPress(QEvent::KeyPress, character.unicode(), Qt::NoModifier, QString(character));
if (!w)
return;
QKeyEvent keyRelease(QEvent::KeyPress, character.unicode(), Qt::NoModifier, QString());
QApplication::sendEvent(w, &keyRelease);
}
void MyInputPanelContext::sendBackSpaceKey()
{
if(!focusWidget()) return;
QKeyEvent delPress(QEvent::KeyPress, Qt::Key_Backspace, Qt::NoModifier);
QApplication::sendEvent(focusWidget(), &delPress);
QKeyEvent delRelease(QEvent::KeyRelease, Qt::Key_Backspace, Qt::NoModifier);
QApplication::sendEvent(focusWidget(), &delRelease);
}
void MyInputPanelContext::sendRightKey()
{
if(!focusWidget())return;
QKeyEvent rightKeyPress(QEvent::KeyPress,Qt::Key_Right,Qt::NoModifier);
QApplication::sendEvent(focusWidget(), &rightKeyPress);
QKeyEvent rightKeyRelease(QEvent::KeyRelease, Qt::Key_Right, Qt::NoModifier);
QApplication::sendEvent(focusWidget(), &rightKeyRelease);
}
void MyInputPanelContext::sendLeftKey()
{
if(!focusWidget()) return;
QKeyEvent leftKeyPress(QEvent::KeyPress,Qt::Key_Left,Qt::NoModifier);
QApplication::sendEvent(focusWidget(), &leftKeyPress);
QKeyEvent leftKeyRelease(QEvent::KeyRelease, Qt::Key_Left, Qt::NoModifier);
QApplication::sendEvent(focusWidget(), &leftKeyRelease);
}
void MyInputPanelContext::sendEnterKey()
{
if(!focusWidget()) return;
QKeyEvent delPress(QEvent::KeyPress, Qt::Key_Enter, Qt::NoModifier);
QApplication::sendEvent(focusWidget(), &delPress);
QKeyEvent delRelease(QEvent::KeyRelease, Qt::Key_Enter, Qt::NoModifier);
QApplication::sendEvent(focusWidget(), &delRelease);
}
void MyInputPanelContext::sendCloseKey()
{
if(!focusWidget()) return;
QKeyEvent delPress(QEvent::KeyPress, Qt::Key_Close, Qt::NoModifier);
QApplication::sendEvent(focusWidget(), &delPress);
QKeyEvent delRelease(QEvent::KeyRelease, Qt::Key_Close, Qt::NoModifier);
QApplication::sendEvent(focusWidget(), &delRelease);
}
void MyInputPanelContext::sendF1Key()
{
if(!focusWidget()) return;
QKeyEvent delPress( QEvent::KeyPress, Qt::Key_F1, Qt::NoModifier);
QApplication::sendEvent(focusWidget(), &delPress);
QKeyEvent delRelease(QEvent::KeyRelease, Qt::Key_F1, Qt::NoModifier);
QApplication::sendEvent(focusWidget(), &delRelease);
}
void MyInputPanelContext::updatePosition()
{
QWidget *widget = focusWidget();
if (!widget)
return;
QRect widgetRect = widget->rect();
QPoint panelPos = QPoint(widgetRect.left(), widgetRect.bottom()+ 2);//
panelPos = widget->mapToGlobal(panelPos);
inputPanel->move(panelPos);
}