当前位置: 代码迷 >> QT开发 >> QT窗口KeyPress事件不响应解决方案
  详细解决方案

QT窗口KeyPress事件不响应解决方案

热度:345   发布时间:2016-04-25 03:07:33.0
QT窗口KeyPress事件不响应
两个窗口已设置连接connect,
1窗口(:public QWidget)发出按键信号(Key_Delete),2窗口(:public QTreeWidget)响应槽函数,
第一次1窗口发出按键信号,2窗口响应函数中创建QMessageBox提示并返回,结束后继续对1窗口按键,此后1窗口的事件不响应(pEvent->type() == QEvent::KeyPress),可能是什么原因造成的?

注:虽然对按键不能进行响应,但是对MouseButtonPress,MouseButtonRelease,FocusOut,FocusIn等事件均可以响应.且1窗口非其他类的父类,没有子类accept.
2窗口中本身也有信号连接至该槽函数,且为同一个按键,而当在2窗口中鼠标点击一下后,即不再有上述问题(此时第一次点击响应1窗口按键事件,之后响应2窗口按键事件,很奇怪,但焦点<通过FocusOut/FocusIn观察得到>仍在1窗口中,2窗口不曾得到焦点,2窗口的按键事件响应是怎么进行的?)

连接:
connect(1窗口del按键,2窗口槽函数MSG)
connect(2窗口del按键,2窗口槽函数MSG)

事件响应顺序:
(****未点击2窗口****)
1)、1窗口得到焦点;
2)、1窗口按键并响应(DEL);
3)、2窗口响应函数发出MSG;
4)、MSG弹框1窗口失去焦点;
5)、确定MSG弹框,1窗口获得焦点;
6)、1窗口按键无响应;

(****点击2窗口****)
1)、1窗口得到焦点;
2)、1窗口按键并响应(DEL);
3)、2窗口响应函数发出MSG;
4)、MSG弹框1窗口失去焦点;
5)、确定MSG弹框,1窗口获得焦点;
6)、此时再按键2窗口按键响应;(2窗口未获得焦点)
7)、MSG弹框1窗口失去焦点;
8)、确定MSG弹框,1窗口获得焦点;(2窗口仍未获得焦点)
9)、重复6-8步骤

------解决思路----------------------
引用:
代码比较长,现在发现是被其父窗口响应掉了

//class MainWindow : public QMainWindow中:
//其中:class Widge: public QWidget,         class Tree : public QTreeWidget
    Widge* m_pWidge = new Widge(this);
    QDockWidget* m_pTree = new QDockWidget(this);
    Tree *pTree  = new Tree(m_pTree );
    connect(m_pWidge , &Widge::SglRemove, pTree , &Tree ::SlotRemove);

void MainWindow ::keyPressEvent(QKeyEvent *pEvent)
{
    qDebug() << "MainWindow keyPressEvent  key : " << pEvent->key();

    QMainWindow::keyPressEvent(pEvent);
}

//class Widge: public QWidget中:
bool Widge::eventFilter(QObject *pWatched, QEvent *pEvent)
{
//...
     if (pKeyEvent->key() == Qt::Key_Delete) {
        QWidget* focuswidget=focusWidget();
qDebug() << "PreviewWindow del key press!";
        emit SglRemove();
focuswidget->setFocus();
qDebug() << "focusWidget: " << focuswidget->windowTitle();
        return true;
    }
//...
}

//class Tree : public QTreeWidget中
void Tree::SlotRemove()
{
    QString msg;
    msg = tr("Are you sure to delete selected objects?");
    QMessageBox msgBox(QMessageBox::NoIcon, tr("Delete"), msg,
        QMessageBox::Yes 
------解决思路----------------------
 QMessageBox::No, this);
    msgBox.setDefaultButton(QMessageBox::No);
    msgBox.setIconPixmap(QPixmap(":/L3DArtist/Resources/Warning_.png"));
    int nBtn = msgBox.exec();
}

由于MSG并非在自身类内创建,销毁后焦点失去(应该并非直接为setFocus),改为最外围的父窗口MainWindow得到焦点,此时该如何设置才能返回至Widge中

还是发信号,你可以让父类MainWindow发一个信号让子类widget接收。
  相关解决方案