Skip to content
This repository has been archived by the owner on Dec 19, 2023. It is now read-only.

Commit

Permalink
fix white-line issue for QWidget applications
Browse files Browse the repository at this point in the history
Fixes: #204

Signed-off-by: Yuhang Zhao <[email protected]>
  • Loading branch information
wangwenx190 committed Apr 7, 2023
1 parent d49c3be commit 632a708
Show file tree
Hide file tree
Showing 2 changed files with 36 additions and 39 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -27,10 +27,6 @@
#include <FramelessHelper/Widgets/framelesshelperwidgets_global.h>
#include <QtGui/qscreen.h>

QT_BEGIN_NAMESPACE
class QPaintEvent;
QT_END_NAMESPACE

FRAMELESSHELPER_BEGIN_NAMESPACE

class MicaMaterial;
Expand Down Expand Up @@ -62,8 +58,9 @@ private Q_SLOTS:
void handleScreenChanged(QScreen *screen);

private:
void changeEventHandler(QEvent *event);
void paintEventHandler(QPaintEvent *event);
void repaintMica();
void repaintBorder();
void emitCustomWindowStateSignals();

Q_SIGNALS:
void micaEnabledChanged();
Expand Down
66 changes: 33 additions & 33 deletions src/widgets/widgetssharedhelper.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -33,7 +33,6 @@
#endif // Q_OS_WINDOWS
#include <QtCore/qcoreevent.h>
#include <QtCore/qloggingcategory.h>
#include <QtGui/qevent.h>
#include <QtGui/qpainter.h>
#include <QtGui/qwindow.h>
#include <QtWidgets/qwidget.h>
Expand Down Expand Up @@ -156,12 +155,21 @@ bool WidgetsSharedHelper::eventFilter(QObject *object, QEvent *event)
return QObject::eventFilter(object, event);
}
switch (event->type()) {
//case QEvent::WindowActivate:
//case QEvent::WindowDeactivate:
case QEvent::ActivationChange:
//case QEvent::ApplicationStateChange:
m_targetWidget->update();
break;
case QEvent::Paint: {
const auto paintEvent = static_cast<QPaintEvent *>(event);
paintEventHandler(paintEvent);
repaintMica();
repaintBorder();
} break;
case QEvent::WindowStateChange:
changeEventHandler(event);
if (event->type() == QEvent::WindowStateChange) {
updateContentsMargins();
emitCustomWindowStateSignals();
}
break;
case QEvent::Move:
case QEvent::Resize:
Expand All @@ -175,47 +183,39 @@ bool WidgetsSharedHelper::eventFilter(QObject *object, QEvent *event)
return QObject::eventFilter(object, event);
}

void WidgetsSharedHelper::changeEventHandler(QEvent *event)
void WidgetsSharedHelper::repaintMica()
{
Q_ASSERT(event);
if (!event) {
if (!m_micaEnabled || !m_micaMaterial) {
return;
}
if (event->type() != QEvent::WindowStateChange) {
QPainter painter(m_targetWidget);
m_micaMaterial->paint(&painter, m_targetWidget->size(), m_targetWidget->mapToGlobal(QPoint(0, 0)));
}

void WidgetsSharedHelper::repaintBorder()
{
if ((Utils::windowStatesToWindowState(m_targetWidget->windowState()) != Qt::WindowNoState) || !m_borderPainter) {
return;
}
updateContentsMargins();
if (const auto mo = m_targetWidget->metaObject()) {
if (const int idx = mo->indexOfSignal(QMetaObject::normalizedSignature("hiddenChanged()").constData()); idx >= 0) {
QMetaObject::invokeMethod(m_targetWidget, "hiddenChanged");
}
if (const int idx = mo->indexOfSignal(QMetaObject::normalizedSignature("normalChanged()").constData()); idx >= 0) {
QMetaObject::invokeMethod(m_targetWidget, "normalChanged");
}
if (const int idx = mo->indexOfSignal(QMetaObject::normalizedSignature("zoomedChanged()").constData()); idx >= 0) {
QMetaObject::invokeMethod(m_targetWidget, "zoomedChanged");
}
}
QPainter painter(m_targetWidget);
m_borderPainter->paint(&painter, m_targetWidget->size(), m_targetWidget->isActiveWindow());
}

void WidgetsSharedHelper::paintEventHandler(QPaintEvent *event)
void WidgetsSharedHelper::emitCustomWindowStateSignals()
{
Q_ASSERT(event);
if (!event) {
const QMetaObject * const mo = m_targetWidget->metaObject();
if (!mo) {
return;
}
if (m_micaEnabled && m_micaMaterial) {
QPainter painter(m_targetWidget);
m_micaMaterial->paint(&painter, m_targetWidget->size(),
m_targetWidget->mapToGlobal(QPoint(0, 0)));
if (const int idx = mo->indexOfSignal(QMetaObject::normalizedSignature("hiddenChanged()").constData()); idx >= 0) {
QMetaObject::invokeMethod(m_targetWidget, "hiddenChanged");
}
if (const int idx = mo->indexOfSignal(QMetaObject::normalizedSignature("normalChanged()").constData()); idx >= 0) {
QMetaObject::invokeMethod(m_targetWidget, "normalChanged");
}
if ((Utils::windowStatesToWindowState(m_targetWidget->windowState()) == Qt::WindowNoState)
&& m_borderPainter) {
QPainter painter(m_targetWidget);
m_borderPainter->paint(&painter, m_targetWidget->size(), m_targetWidget->isActiveWindow());
if (const int idx = mo->indexOfSignal(QMetaObject::normalizedSignature("zoomedChanged()").constData()); idx >= 0) {
QMetaObject::invokeMethod(m_targetWidget, "zoomedChanged");
}
// Don't eat this event here, we need Qt to keep dispatching this paint event
// otherwise the widget won't paint anything else from the user side.
}

void WidgetsSharedHelper::handleScreenChanged(QScreen *screen)
Expand Down

0 comments on commit 632a708

Please sign in to comment.