Qt::事件
qt中的事件和信号槽并不是可以相互代替的。信号由具体的对象发出,然后会马上交给由connect()函数连接的槽进行处理;而对于事件,Qt使用一个事件队列并对所有发出的事件进行维护,当新的事件产生时,会被追加到事件队列的尾部。前一个事件完成后,取出后面的事件进行处理。
总的来说,如果我们使用组件,我们关心的是信号槽;我们我们自定义组件,我们关心的是事件。因为我们可以通过事件来改变组件的默认操作
注意:QWidget中有一个mouseTracking属性,该属性用于设置是否追踪鼠标。只有鼠标在被追踪时,mouseMoveEvent()才会发出。
eg:Cusbutton继承QPushButton..点击Cusbutton后会触发槽函数,,,但是我重写了Cusbutton的mousepress函数。为什么槽函数就不调用了。----点击Cusbutton实际上是由于QPushButton发出了clicked的信号。
class CustomButton1 : public QPushButton
{
Q_OBJECT
public:
CustomButton1(QWidget *parent = 0);
private:
void onButtonCliecked();
};
class CustomButton2 : public CustomButton1
{
Q_OBJECT
public:
CustomButton2(QWidget *parent = 0);
private:
void onButtonCliecked();
};
CustomButton1::CustomButton1(QWidget *parent) :
QPushButton(parent)
{
connect(this, &CustomButton1::clicked,
this, &CustomButton1::onButtonCliecked);
}
void CustomButton1::onButtonCliecked()
{
//qDebug() << "You clicked this!";
QMessageBox::information(0,"hehe","you clicked this");
}
CustomButton2::CustomButton2(QWidget *parent) :
CustomButton1(parent)
{
connect(this, &CustomButton2::clicked,
this, &CustomButton2::onButtonCliecked);
}
void CustomButton2::onButtonCliecked()
{
//qDebug() << "You clicked this!";
QMessageBox::information(0,"hehe","you clicked this2");
}
亲测。在main函数里面建立一个CustomButton2的对象。点击该按钮后会先弹出
CustomButton1的响应函数,再弹出CustomButton2的响应函数。当我们重写事件回调函数时,时刻注意是否需要通过调用父类的同名函数来确保原有实现仍然能够进行!
如果一个事件处理函数调用了一个事件对象的accept函数,这个事件就不会被继续传播给其父组件;如果它调用了事件的ignore函数,Qt会从父组件中寻找另外的接受者(也要接着执行event->ignore后面的函数)。实际上,我们一般都不去使用accept和ignore,而只需调用父类的响应函数即可。qt的事件都是protected的,因此,重写的函数必定存在着其父类中的响应函数,所以,只需调用即可。选择这样而不显示的调用两个函数的原因是:我们无法确认父类中的这个处理函数有没有额外的操作。如果直接忽略掉可能会有潜在的危险。
注意:事件的传播是在组件层次上面的,而不是依靠类继承机制。
在一个情况下,我们必须使用accept和ignore函数,这就是窗口关闭的事件,这里的理解与前面的不同,对于QCloseEvent事件,调用accept意味着Qt会停止事件的传播,调用ignore则意味着事件继续传播。