Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/image-processing/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Keyboard 无法从Qwidget向主窗口发送信号_Keyboard_Qt4_Virtual - Fatal编程技术网

Keyboard 无法从Qwidget向主窗口发送信号

Keyboard 无法从Qwidget向主窗口发送信号,keyboard,qt4,virtual,Keyboard,Qt4,Virtual,我曾经编写过一个虚拟键盘应用程序。我对它做了一些修改,接受退格、左键等。 我想做的是从输入面板窗体向主窗口发送一个信号(enterKeyGenerated)。但我没有这样做。这是我的密码: MyInputPanel.cpp(已编辑) MyInputPanelContext.cpp: #include <QtCore> #include "myinputpanelcontext.h" MyInputPanelContext::MyInputPanelContext() {

我曾经编写过一个虚拟键盘应用程序。我对它做了一些修改,接受退格、左键等。 我想做的是从输入面板窗体向主窗口发送一个信号(enterKeyGenerated)。但我没有这样做。这是我的密码:

MyInputPanel.cpp(已编辑)

MyInputPanelContext.cpp:

 #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);

}