事件问题 父窗口部件与子窗口部件问题
////////////////////////////////////////////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
三、可以增加全局的键盘事件回调,或者直接设置那个得焦点 --------------------编程问答--------------------
谢谢 MicroSky2813 !
再问问你:
一、你说的第一点我明白,想问你,为什么第二个工程 QPushButton(parent) 中的 parent 不能用 this 代替,用 this 不就是代表父窗口是 main() 函数中定义的 QDialog 对象吗?
二、你是说继承重写 keyPressEvent() 事件吗?我试过了,如果在第二个工程中采用重写 keyPressEvent() 事件的方法,不会响应按键事件。
三、设置目标部件得焦点我试过了,可以。如何增加全局的键盘事件回调?我还没有接触到这点,忘您指点指点。 --------------------编程问答--------------------
修改一下问题一:
一、第一种方法 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