QT窗口KeyPress事件不响应

xyconly 2014-10-29 05:19:03
两个窗口已设置连接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步骤
...全文
1873 4 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
小吥点 2014-10-30
  • 打赏
  • 举报
回复
引用 3 楼 xyconly 的回复:
代码比较长,现在发现是被其父窗口响应掉了

//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接收。
xyconly 2014-10-29
  • 打赏
  • 举报
回复
代码比较长,现在发现是被其父窗口响应掉了

//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中
小吥点 2014-10-29
  • 打赏
  • 举报
回复
引用 1 楼 xyconly 的回复:
纠正一下:2窗口点击item会使1窗口获得焦点
你确定你1窗口的这个按键信号传过去了的?2窗口中的槽函数的响应是由于1窗口的信号还是2窗口中另外一个连接该槽函数的信息产生的,还有你第一次按1窗口后2窗口槽函数响应,是因为鼠标信号还是还是你的按键信号,因为你在按键之前你首先获取到了焦点,也就是你应该是用鼠标事件获取到了焦点,并且发了一个信号给2窗口,并不是之后的你按键信号,这些都是都是我大致上分析的,可以的话你把代码贴出来看看。
xyconly 2014-10-29
  • 打赏
  • 举报
回复
纠正一下:2窗口点击item会使1窗口获得焦点

16,816

社区成员

发帖
与我相关
我的任务
社区描述
Qt 是一个跨平台应用程序框架。通过使用 Qt,您可以一次性开发应用程序和用户界面,然后将其部署到多个桌面和嵌入式操作系统,而无需重复编写源代码。
社区管理员
  • Qt
  • 亭台六七座
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧