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))
{
initUi();
QMetaObject::invokeMethod(this, &FullQuickItem::resizeSelf, Qt::QueuedConnection);
}
FullQuickItem::~FullQuickItem()
@ -42,10 +43,9 @@ QuickSettingItem::QuickSettingType FullQuickItem::type() const
bool FullQuickItem::eventFilter(QObject *obj, QEvent *event)
{
if (obj == m_centerWidget && event->type() == QEvent::Resize) {
m_effectWidget->setFixedHeight(m_centerWidget->height());
setFixedHeight(m_centerWidget->height());
}
if (obj == m_centerWidget && event->type() == QEvent::Resize)
resizeSelf();
return QuickSettingItem::eventFilter(obj, event);
}
@ -74,3 +74,9 @@ void FullQuickItem::initUi()
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:
void initUi();
void resizeSelf();
private:
QWidget *m_centerWidget;

View File

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

View File

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

View File

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