QObject::event(),
QObject::installEventFilter(),
QWidget::event(),
QCoreApplication::sendEvent(),
QCoreApplication::postEvent(),
QCoreApplication::processEvents().
普通事件:void customEvent(QEvent* event);
QT自带的事件处理就不多说了,主要是自定义事件的处理过程。
QEvent:Type中给预留的自定义事件的ID
User = 1000, // first user event id
MaxUser = 65535 // last user event id
在你想使用事件的函数中自建一个事件ID,然后抛出此事件
比如:
int LivePreviewWidget::playerEventCallback0(XD_PlayerEventType event, void *opaque)
{
if(event == XD_PlayerPositionChanged) {
QEvent *ev = new QEvent(static_cast<QEvent::Type>(QEvent::User + 3));
qApp->postEvent(static_cast<LivePreviewWidget*>(opaque), ev);
}else if(event == XD_PlayerVout){
QEvent *ev = new QEvent(static_cast<QEvent::Type>(QEvent::User + 4));
qApp->postEvent(static_cast<LivePreviewWidget*>(opaque), ev);
}
return 0;
}
重载 void customEvent(QEvent* event);捕捉到你想要的事件对它进行相当的处理。
void LivePreviewWidget::customEvent(QEvent *event)
{
if(event->type() == static_cast<QEvent::Type>(QEvent::User + 2)) {
stop();
showText(tr("DisConnect..."));
updateTitleText();
setStatus("Interrupt", true);
emit statusChanged(this);
bool isAuto = PlayWidget::status("Auto").toBool();
if(isAuto)
_timer->start(1000);
} else if(event->type() == static_cast<QEvent::Type>(QEvent::User + 3)) {
setStatus("Interrupt", false);
setStatus("Playing", true);
emit statusChanged(this);
updateTitleText();
XD_PlayerDetachEvent(_tokenManage[_id]->playToken(), XD_PlayerPositionChanged);
} else if(event->type() == static_cast<QEvent::Type>(QEvent::User + 4)){
updateTitleText();
}
QWidget::customEvent(event);
}
其实在应用中最多的还是处理鼠标事件:自定义鼠标事件进行自己想要的处理。
运用起来还普通事件的处理差不多。
首先进行事件注册。
把你想进行事件处理的UI注册事件处理。
ui->treeView->installEventFilter(this);
ui->tabWidget->installEventFilter(this);
installEventFilter(this);
对事件处理函数进行重载。
bool eventFilter(QObject *obj, QEvent *event);
bool CameraSetting::eventFilter(QObject *obj, QEvent *event)
{
if(event->type() == QEvent::MouseButtonPress)
{
QMouseEvent *event2 = static_cast<QMouseEvent *>(event);
if(event2->button() == Qt::RightButton)
{
hide();
return true;
}
else
{
return QObject::eventFilter(obj, event);
}
}
else
{
// standard event processing
return QObject::eventFilter(obj, event);
}
}
QEvent 常用到的Type:
None = 0, // invalid event
Timer = 1, // timer event
MouseButtonPress = 2, // mouse button pressed
MouseButtonRelease = 3, // mouse button released
MouseButtonDblClick = 4, // mouse button double click
MouseMove = 5, // mouse move
KeyPress = 6, // key pressed
KeyRelease = 7, // key released
FocusIn = 8, // keyboard focus received
FocusOut = 9, // keyboard focus lost
Enter = 10, // mouse enters widget
Leave = 11, // mouse leaves widget
Paint = 12, // paint widget
Move = 13, // move widget
Resize = 14, // resize widget
Create = 15, // after widget creation
Destroy = 16, // during widget destruction
Show = 17, // widget is shown
Hide = 18, // widget is hidden
Close = 19, // request to close widget
Quit = 20, // request to quit application
ParentChange = 21, // widget has been reparented
ParentAboutToChange = 131, // sent just before the parent change is done
QEvent 中 MouseButtonPress 事件又可以进行类行转化 QMouseEvent *event2 = static_cast<QMouseEvent *>(event);
enum MouseButton {
NoButton = 0x00000000,
LeftButton = 0x00000001,
RightButton = 0x00000002,
MidButton = 0x00000004, // ### Qt 5: remove me
MiddleButton = MidButton,
XButton1 = 0x00000008,
XButton2 = 0x00000010,
MouseButtonMask = 0x000000ff
};
根据自己想处理的鼠标事件就可以进行相应的操作。