fix: 修复移除插件后快捷面板显示异常的问题

1、在插件移除后,除了从面板上将该插件的Widget移除外,删除该插件创建出来的QWidget
2、在插件对应的QWidget尺寸发生变化后,重新设置面板尺寸
3、在释放任务栏图标后,恢复ToolTip的parent

Log: 修复移除插件后快捷面板显示异常的问题
Influence: 不断插入或者移除蓝牙设备,观察快捷面板是否显示正常
Bug: https://pms.uniontech.com/bug-view-171579.html
Change-Id: I8168b49ad9eb047155efbd609be65f3dd263b6bc
This commit is contained in:
donghualin 2022-11-18 09:22:39 +00:00
parent e6a73fe3c3
commit 16a8cf7d3e
5 changed files with 37 additions and 16 deletions

View File

@ -27,6 +27,7 @@ FullQuickItem::FullQuickItem(PluginsItemInterface *const pluginInter, QWidget *p
, m_effectWidget(new DBlurEffectWidget(this)) , m_effectWidget(new DBlurEffectWidget(this))
{ {
initUi(); initUi();
QMetaObject::invokeMethod(this, &FullQuickItem::resizeSelf, Qt::QueuedConnection);
} }
FullQuickItem::~FullQuickItem() FullQuickItem::~FullQuickItem()
@ -42,10 +43,9 @@ QuickSettingItem::QuickSettingType FullQuickItem::type() const
bool FullQuickItem::eventFilter(QObject *obj, QEvent *event) bool FullQuickItem::eventFilter(QObject *obj, QEvent *event)
{ {
if (obj == m_centerWidget && event->type() == QEvent::Resize) { if (obj == m_centerWidget && event->type() == QEvent::Resize)
m_effectWidget->setFixedHeight(m_centerWidget->height()); resizeSelf();
setFixedHeight(m_centerWidget->height());
}
return QuickSettingItem::eventFilter(obj, event); return QuickSettingItem::eventFilter(obj, event);
} }
@ -74,3 +74,9 @@ void FullQuickItem::initUi()
m_centerWidget->installEventFilter(this); m_centerWidget->installEventFilter(this);
} }
void FullQuickItem::resizeSelf()
{
m_effectWidget->setFixedHeight(m_centerWidget->height());
setFixedHeight(m_centerWidget->height());
}

View File

@ -38,6 +38,7 @@ protected:
private: private:
void initUi(); void initUi();
void resizeSelf();
private: private:
QWidget *m_centerWidget; QWidget *m_centerWidget;

View File

@ -512,6 +512,7 @@ QuickDockItem::QuickDockItem(PluginsItemInterface *pluginItem, const QJsonObject
, m_position(Dock::Position::Bottom) , m_position(Dock::Position::Bottom)
, m_popupWindow(new DockPopupWindow) , m_popupWindow(new DockPopupWindow)
, m_contextMenu(new QMenu(this)) , m_contextMenu(new QMenu(this))
, m_tipParent(nullptr)
{ {
m_popupWindow->setShadowBlurRadius(20); m_popupWindow->setShadowBlurRadius(20);
m_popupWindow->setRadius(6); m_popupWindow->setRadius(6);
@ -531,6 +532,10 @@ QuickDockItem::QuickDockItem(PluginsItemInterface *pluginItem, const QJsonObject
QuickDockItem::~QuickDockItem() QuickDockItem::~QuickDockItem()
{ {
QWidget *tipWidget = m_pluginItem->itemTipsWidget(m_itemKey);
if (tipWidget && tipWidget->parentWidget() == m_popupWindow)
tipWidget->setParent(m_tipParent);
m_popupWindow->deleteLater(); m_popupWindow->deleteLater();
} }
@ -604,6 +609,11 @@ void QuickDockItem::enterEvent(QEvent *event)
if (!tipWidget) if (!tipWidget)
return; return;
// 记录下toolTip的parent因为在调用DockPopupWindow的时候会将DockPopupWindow设置为toolTip的parent,
// 在DockPopupWindow对象释放的时候, 会将toolTip也一起给释放
if (tipWidget->parentWidget() != m_popupWindow)
m_tipParent = tipWidget->parentWidget();
switch (m_position) { switch (m_position) {
case Top: case Top:
m_popupWindow->setArrowDirection(DockPopupWindow::ArrowTop); m_popupWindow->setArrowDirection(DockPopupWindow::ArrowTop);

View File

@ -122,6 +122,7 @@ private:
Dock::Position m_position; Dock::Position m_position;
DockPopupWindow *m_popupWindow; DockPopupWindow *m_popupWindow;
QMenu *m_contextMenu; QMenu *m_contextMenu;
QWidget *m_tipParent;
}; };
#endif // QUICKPLUGINWINDOW_H #endif // QUICKPLUGINWINDOW_H

View File

@ -157,8 +157,7 @@ bool QuickSettingContainer::eventFilter(QObject *watched, QEvent *event)
{ {
switch (event->type()) { switch (event->type()) {
case QEvent::Resize: { case QEvent::Resize: {
if (watched == m_childPage) onResizeView();
onResizeView();
break; break;
} }
case QEvent::MouseButtonPress: { case QEvent::MouseButtonPress: {
@ -221,19 +220,23 @@ void QuickSettingContainer::appendPlugin(PluginsItemInterface *itemInter, bool n
void QuickSettingContainer::onPluginRemove(PluginsItemInterface *itemInter) void QuickSettingContainer::onPluginRemove(PluginsItemInterface *itemInter)
{ {
for (QuickSettingItem *item : m_quickSettings) { QList<QuickSettingItem *>::Iterator removeItemIter = std::find_if(m_quickSettings.begin(), m_quickSettings.end(), [ = ](QuickSettingItem *item)->bool {
if (item->pluginItem() != itemInter) return item->pluginItem() == itemInter;
continue; });
if (item->type() == QuickSettingItem::QuickSettingType::Full) QuickSettingItem *removeItem = *removeItemIter;
m_componentWidget->layout()->removeWidget(item); if (!removeItem)
else return;
m_pluginLayout->removeWidget(item);
m_quickSettings.removeOne(item); if (removeItem->type() == QuickSettingItem::QuickSettingType::Full)
break; m_componentWidget->layout()->removeWidget(removeItem);
} else
m_pluginLayout->removeWidget(removeItem);
m_quickSettings.removeOne(removeItem);
removeItem->deleteLater();
updateItemLayout();
onResizeView(); onResizeView();
} }