feat: 修复任务栏崩溃问题

输入法切换为中文时,访问空指针导致崩溃

Log: 修复任务栏崩溃问题
Task: https://pms.uniontech.com/zentao/task-view-90342.html
Influence: 任务栏插件-中文输入法插件,右键菜单出现后,鼠标或者手指操作过程中会出现崩溃情况
Change-Id: I3d753b093d239b22e4f89272021d9a795f6553d4
This commit is contained in:
songwentao 2021-11-04 15:06:08 +08:00
parent 153482248e
commit 84b7b5e288
3 changed files with 11 additions and 44 deletions

View File

@ -71,9 +71,9 @@ private:
void onTrayWidgetClicked();
private:
// 动态加载的插件内存空间与dock进程内存空间相互独立创建手势服务监听触摸按下动作
QPointer<AbstractTrayWidget> m_absTrayWidget;
// 动态加载的插件内存空间与dock进程内存空间相互独立创建手势服务监听触摸按下动作
QPointer<TouchSignalManager> m_touchSignalManager;
QVBoxLayout *m_layout;

View File

@ -49,6 +49,7 @@ SNITrayWidget::SNITrayWidget(const QString &sniServicePath, QWidget *parent)
, m_popupTipsDelayTimer(new QTimer(this))
, m_handleMouseReleaseTimer(new QTimer(this))
, m_tipsLabel(new TipsWidget(this))
, m_menuState(false)
{
m_popupTipsDelayTimer->setInterval(500);
m_popupTipsDelayTimer->setSingleShot(true);
@ -338,12 +339,13 @@ void SNITrayWidget::showContextMenu(int x, int y)
// 第三方的右键菜单事件过滤方式无法捕获修改x,y值不能改变菜单弹出位置
if (m_sniMenuPath.path().startsWith("/NO_DBUSMENU")) {
m_sniInter->ContextMenu(x, y);
m_menuState = false;
} else {
m_menuState = true;
if (!m_menu) {
qDebug() << "context menu has not be ready, init menu";
initMenu();
}
if (m_menu)
m_menu->popup(QPoint(x, y));
}
@ -735,55 +737,17 @@ bool SNITrayWidget::eventFilter(QObject *watched, QEvent *event)
if (!m_menu)
return QWidget::eventFilter(watched, event);
QPoint startPos = QPoint();
if (!watched->objectName().startsWith("sniMenu")) {
if (event->type() == QEvent::MouseButtonPress) {
QMouseEvent *mouseEvent = static_cast<QMouseEvent *>(event);
if (mouseEvent->button() == Qt::LeftButton) {
if (m_sniMenuPath.path().startsWith("/NO_DBUSMENU")) {
// 关闭中文输入法或者五笔输入法,当前的关闭方式无效
QMouseEvent *pressEvent = new QMouseEvent(QEvent::MouseButtonPress, mapToGlobal(this->pos()), Qt::LeftButton, Qt::LeftButton, Qt::NoModifier);
qApp->postEvent(this->parentWidget(), pressEvent);
} else {
// 只处理qt右键菜单外部菜单无法处理
if (m_menuState)
m_menu->hide();
}
}
startPos = mouseEvent->pos();
} else if (event->type() == QEvent::DragMove || event->type() == QEvent::Move) {
if (m_sniMenuPath.path().startsWith("/NO_DBUSMENU")) {
// 关闭中文输入法或者五笔输入法,当前的关闭方式无效
QMouseEvent *pressEvent = new QMouseEvent(QEvent::MouseButtonPress, mapToGlobal(this->pos()), Qt::LeftButton, Qt::LeftButton, Qt::NoModifier);
qApp->postEvent(this->parentWidget(), pressEvent);
} else {
} else if (event->type() == QEvent::DragMove) {
if (m_menuState)
m_menu->hide();
}
}
// 让click无效,避免点击到插件上
if (event->type() == QEvent::MouseButtonRelease) {
QMouseEvent *mouseEvent = static_cast<QMouseEvent *>(event);
if (mouseEvent->source() == Qt::MouseEventSynthesizedByQt) {
if (isVisible())
return true;
}
}
// 处理当右键菜单显示时,esc按下关闭右键菜单保持和模态框一样的效果
if (event->type() == QEvent::KeyPress) {
QKeyEvent *keyEvent = static_cast<QKeyEvent *>(event);
if (keyEvent->key() == Qt::Key_Escape) {
if (!isVisible())
return false;
if (m_sniMenuPath.path().startsWith("/NO_DBUSMENU")) {
// 关闭中文输入法或者五笔输入法,当前的关闭方式无效
QMouseEvent *pressEvent = new QMouseEvent(QEvent::MouseButtonPress, mapToGlobal(this->pos()), Qt::LeftButton, Qt::LeftButton, Qt::NoModifier);
qApp->postEvent(this->parentWidget(), pressEvent);
} else {
m_menu->hide();
}
return true;
}
}
}

View File

@ -151,6 +151,9 @@ private:
static QPointer<DockPopupWindow> PopupWindow;
Dock::TipsWidget *m_tipsLabel;
bool m_popupShown;
// qt右键菜单: true, 外部菜单: false
bool m_menuState;
};
#endif /* SNIWIDGET_H */