当前位置:编程学习 > wap >>

事件问题 父窗口部件与子窗口部件问题

////////////////////////////////////////////main.cpp ///////////////////////////////// 
 #include"KDlg.h" 
 int main(int argc,char* argv[]) 
 {  
    QApplication app(argc,argv); 
    KDialog kdlg; ////////////////////////第一个疑问点点点点点点点点点点点点点点点点点 
    kdlg.resize(400, 300); 
    kdlg.setWindowTitle(QObject::tr("KDialog")); 
    kdlg.show(); 
    return app.exec(); 
 } 

 //////////////////////////////////////////KDlg.h////////////////////////////////////// 
 #ifndef KDLG_H 
 #define KDLG_H 

 #include <QApplication> 
 #include <QDialog> 
 #include <QPushButton> 
 #include <QKeyEvent> 

 class KDialog:public QDialog 
 { 
    Q_OBJECT 
 public: 
    KDialog(); 
 private: 
    QPushButton *KBtn1; 
    QPushButton *KBtn2; 
 protected: 
    void keyPressEvent(QKeyEvent *event); 
 }; 

 #endif // KDLG_H 

 /////////////////////////////////KDlg.cpp /////////////////////////////////// 
 #include"KDlg.h" 

 KDialog::KDialog() 
 { 
    KBtn1 = new QPushButton(this); /////////////////////////第一个疑问点点点点点点点点点点点点点点点点点 
    KBtn1->setGeometry(50,50,85,27); 
    KBtn1->setText("BTN1111111"); 

    KBtn2 = new QPushButton(this); 
    KBtn2->setGeometry(150,50,85,27); 
    KBtn2->setText("BTN2222222"); 
 } 

 void KDialog::keyPressEvent(QKeyEvent *event) 
 { 
     if(event->key() == Qt::Key_F1) 
     { 
        KBtn1->setText("KEYPRESS111111111"); 
        KBtn2->setText("KEYPRESS222222222"); 
     } 
 } 

 //////////////////////////////////////////////////////////////////////////////////////////// 
 ///////////////////////////大家帮我看看,我对下面的现象不是很明白,哪位帮我解读解读,谢谢啦! 
 /////////////////////////////////////////实现同一种效果,上面是第一种方式,下面是第二种方式。
/////////////////////////////第一种方式父窗口是自定义类的对象,第二种方式父窗口部件是QDialog。 
 //////////////////////////////////////////////////////////////////////////////////////////// 
/////////////////////////////////////////main.cpp /////////////////////////////////////////// 
 #include"KDlg_parent.h" 

 int main(int argc,char* argv[]) 
 { 
    QApplication app(argc,argv); 
    QDialog* dlg = new QDialog; 
    KDialog kdlg(dlg); /////////////////////////////////第一个疑问点点点点点点点点点点点点点点点点点 
    dlg->resize(400, 300); 
    dlg->setWindowTitle(QObject::tr("KDialog")); 
    dlg->show(); 
    return app.exec(); 
 } 

 /////////////////////////////////////KDlg_parent.h /////////////////////////////////////////// 
 #ifndef KDLG_PARENT_H 
 #define KDLG_PARENT_H 

 #include <QApplication> 
 #include <QDialog> 
 #include <QKeyEvent> 

 class KDialog:public QDialog 
 { 
    Q_OBJECT 
 public: 
    KDialog(QDialog* = 0); 
 private: 
    QPushButton *KBtn1; 
    QPushButton *KBtn2; 
 protected: 
    bool eventFilter(QObject *target, QEvent *event); 
 }; 

 #endif // KDLG_PARENT_H 

 /////////////////////////////////////KDlg_parent.cpp //////////////////////////////////// 
 #include"KDlg_parent.h" 

 KDialog::KDialog(QDialog* parent):QDialog(parent) 
 { 
    KBtn1 = new QPushButton(parent); //////////////////////第一个疑问点点点点点点点点点点点点点点点点 
    KBtn1->setGeometry(50,50,85,27); 
    KBtn1->setText("BTN1111111111"); 

    KBtn2 = new QPushButton(parent); 
    KBtn2->setGeometry(150,50,85,27); 
    KBtn2->setText("BTN2222222222"); 

    KBtn2->installEventFilter(this); ////////////////////////////////安装事件过滤器 
 } 

 bool KDialog::eventFilter(QObject *target, QEvent *event) 
 { 
    if(target == KBtn2) 
    { 
       if(event->type() == QEvent::KeyPress) 
       {  
          QKeyEvent *keyEvent = static_cast<QKeyEvent *>(event); 
          if(keyEvent->key() == Qt::Key_F1) 
          { 
              KBtn2->setText("KEYPRESS111111111"); 
              KBtn2->setText("KEYPRESS222222222"); 
          } 
          return true; 
       } 
    } 
    return QDialog::eventFilter(target,event); 
 } 

 //////////////////////////////////////////////////////////////////////////////////////////////// 
 我不明白的问题有几个: 
 一、第一种方法 KBtn1 = new QPushButton(this); 中 this 意思是父窗口是他本身,第二种方法 KBtn1 = new QPushButton(parent); 中的 parent 意思是父窗口是QDialog的对象。我的解释有没有错?如果没有错为什么第二种方法中的 parents 不能用 this ?哪种方法好(也就是要不要 QDialog 作为父窗口)? 
 二、为什么第二个工程的事件不能用重新实现 keyPressEvent() 的方法,而只能用安装事件过滤器的方法? 
 三、为什么第二种方法中只有当 KBtn2 获得焦点后(运行之初要通过方向键将焦点移至 KBtn2 )按键盘 F1 键才能响应键盘事件?  有什么方法能一运行 按 F1 键就能响应键盘事件? 
 谢谢朋友的回答!!! --------------------编程问答-------------------- 自己顶一下先。
等待您的回答...... --------------------编程问答-------------------- 一、QPushButton(parent)能把button显示在父窗口上
二、可以继承重写那个事件的,不一定一定要installEventFilter
三、可以增加全局的键盘事件回调,或者直接设置那个得焦点 --------------------编程问答--------------------
引用 2 楼 microsky2813 的回复:
一、QPushButton(parent)能把button显示在父窗口上
二、可以继承重写那个事件的,不一定一定要installEventFilter
三、可以增加全局的键盘事件回调,或者直接设置那个得焦点


谢谢 MicroSky2813 !

再问问你:
一、你说的第一点我明白,想问你,为什么第二个工程 QPushButton(parent) 中的 parent 不能用 this 代替,用 this 不就是代表父窗口是 main() 函数中定义的 QDialog 对象吗?
二、你是说继承重写 keyPressEvent() 事件吗?我试过了,如果在第二个工程中采用重写 keyPressEvent() 事件的方法,不会响应按键事件。
三、设置目标部件得焦点我试过了,可以。如何增加全局的键盘事件回调?我还没有接触到这点,忘您指点指点。 --------------------编程问答--------------------
引用 1 楼 notebook650_1 的回复:
自己顶一下先。
等待您的回答......


修改一下问题一:
一、第一种方法 KBtn1 = new QPushButton(this); 中 this 意思是父窗口是当前 KDialog 对象
第二种方法 KBtn1 = new QPushButton(parent); 中的 parent 意思是父窗口是QDialog的对象。我的解释有没有错?如果没有错为什么第二种方法中的 parents 不能用 this (即父窗口是 main() 函数中创建的 QDialog 对象)?哪种方法好(也就是要不要 QDialog 作为父窗口)? 
--------------------编程问答-------------------- 没人回应哦。。。。。。 --------------------编程问答--------------------
引用 5 楼 notebook650_1 的回复:
没人回应哦。。。。。。

回应来了 --------------------编程问答--------------------
引用 4 楼 notebook650_1 的回复:
引用 1 楼 notebook650_1 的回复:自己顶一下先。等待您的回答......

修改一下问题一:
一、第一种方法 KBtn1 = new QPushButton(this); 中 this 意思是父窗口是当前 KDialog 对象
第二种方法 KBtn1 = new QPushButton(parent); 中的 parent 意思是父窗口是QDialog的对象。我的解释有没有错?如果没有错为什么第二种方法中的 parents 不能用 this(即父窗口是 main() 函数中创建的 QDialog 对象)?哪种方法好(也就是要不要 QDialog 作为父窗口)?


我仔细看了一下你的程序并RUN了一下.
问题1 你的第二种方法是可以的
   但不要忘了,#include<QtGui> #include<QtCore>,加了以后就可以了
问题二与三,你要注意Qt的回调机制,构造时的parent,子类在Event回调后执行parent回调,全局如果都有一个共同parents,就可以在parent里做事件了,你的第一种方法就是这么回事。而第二种在所有回调里都判断了Event target,即使到了父类而不执行 --------------------编程问答--------------------
引用 7 楼 microsky2813 的回复:
引用 4 楼 notebook650_1 的回复:引用 1 楼 notebook650_1 的回复:自己顶一下先。等待您的回答...... 修改一下问题一:一、第一种方法 KBtn1 = new QPushButton(this); 中 this 意思是父窗口是当前 KDialog 对象第二种方法 KBtn1 = new QPushButton(parent); 中的 parent 意思是父窗口是QDialog的对象。我的解释有没有错?如果没有错为什么第二种方法中的 parents 不能用 this(即父窗口是 main() 函数中创建的 QDialog 对象)?哪种方法好(也就是要不要 QDialog 作为父窗口)?

我仔细看了一下你的程序并RUN了一下.
问题1 你的第二种方法是可以的
  但不要忘了,#include <QtGui> #include <QtCore>,加了以后就可以了
问题二与三,你要注意Qt的回调机制,构造时的parent,子类在Event回调后执行parent回调,全局如果都有一个共同parents,就可以在parent里做事件了,你的第一种方法就是这么回事。而第二种在所有回调里都判断了Event target,即使到了父类而不执行


太好了,终于又看到你了!

回调机制,我不是太明白。
如果在 KDlg_parent.cpp 文件里重新实现 keyPressEvent() 函数,不会响应键盘事件。因为这里的keyPressEvent() 只对子类 KDialog 有效,而对父窗口无效。 是不是就是你说的没有共同的 parent ?
你有没有办法在第二个工程中采用重新实现 keyPressEvent() 的方法? --------------------编程问答--------------------
引用 8 楼 notebook650_1 的回复:
引用 7 楼 microsky2813 的回复:引用 4 楼 notebook650_1 的回复:引用 1 楼 notebook650_1 的回复:自己顶一下先。等待您的回答...... 修改一下问题一:一、第一种方法 KBtn1 = new QPushButton(this); 中 this 意思是父窗口是当前 KDialog 对象第二种方法 KBtn1 = new QPushButton(parent); 中的 parent 意思是父窗口是QDialog的对象。我的解释有没有错?如果没有错为什么第二种方法中的 parents 不能用 this(即父窗口是 main() 函数中创建的 QDialog 对象)?哪种方法好(也就是要不要 QDialog 作为父窗口)? 我仔细看了一下你的程序并RUN了一下. 问题1 你的第二种方法是可以的   但不要忘了,#include <QtGui> #include <QtCore>,加了以后就可以了问题二与三,你要注意Qt的回调机制,构造时的parent,子类在Event回调后执行parent回调,全局如果都有一个共同parents,就可以在parent里做事件了,你的第一种方法就是这么回事。而第二种在所有回调里都判断了Event target,即使到了父类而不执行

太好了,终于又看到你了!

回调机制,我不是太明白。
如果在 KDlg_parent.cpp 文件里重新实现 keyPressEvent() 函数,不会响应键盘事件。因为这里的keyPressEvent() 只对子类 KDialog 有效,而对父窗口无效。 是不是就是你说的没有共同的 parent ?
你有没有办法在第二个工程中采用重新实现 keyPressEvent() 的方法?

bool KDialog::eventFilter(QObject *target, QEvent *event) 

    if(target == KBtn2) 
    { 
            {  
          QKeyEvent *keyEvent = static_cast <QKeyEvent *>(event); 
          if(keyEvent->key() == Qt::Key_F1) 
          { 
              KBtn2->setText("KEYPRESS111111111"); 
              KBtn2->setText("KEYPRESS222222222"); 
          } 
          return true; 
      } 
    } 
    return QDialog::eventFilter(target,event); 


QDialog::eventFilter(target,event);   实现了回调的继续
实现的问题,可以考虑在构造函数里加parent->installEventFilter(this); 
但你的event事件有target判定,这在你的第一个里面是不一样的 --------------------编程问答-------------------- 谢谢!

以后还请你多多帮助! --------------------编程问答-------------------- 没人回应哦。。。。。。
补充:移动开发 ,  Qt
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,