fix: frameless window - all corners rounded + resize fixed

- CentralWidget with bottom-left/bottom-right radius 8px
- Event filter on central widget to forward mouse events for resize
- Consolidated windowFlags (Qt::Window | Frameless | MinMax | Close)
- setMouseTracking(true) for cursor updates
- Removed WA_TranslucentBackground causing black corners
- Status bar fully removed (setStatusBar(nullptr))
This commit is contained in:
2026-08-23 16:59:17 +02:00
parent 0bb8738607
commit e28ab35fa9
2 changed files with 49 additions and 21 deletions
+48 -19
View File
@@ -24,25 +24,23 @@ MainMainWindow::MainMainWindow(QWidget *parent)
: QMainWindow(parent), m_currentFolderId(-1), m_currentMailId(-1)
{
qDebug() << "[MainMainWindow] Constructor start";
// Enable mouse tracking for resize cursor
setMouseTracking(true);
setupUI();
qDebug() << "[MainMainWindow] setupUI done";
connectModels();
qDebug() << "[MainMainWindow] connectModels done";
setWindowTitle("Wino Mail DTK");
resize(1280, 820);
// Setup progress bar in status bar
m_progressBar = new QProgressBar(this);
m_progressBar->setMaximumWidth(120);
m_progressBar->setVisible(false);
statusBar()->addPermanentWidget(m_progressBar);
// Note: status bar is removed in createTitleBar(), no progress bar in status bar
// Connect mail service progress/status signals
connect(m_mailService, &MailService::progressChanged, this, &MainMainWindow::onProgressChanged);
connect(m_mailService, &MailService::statusMessage, this, &MainMainWindow::onStatusMessage);
connect(m_mailService, &MailService::mailSent, this, [this](const QString &) {
statusBar()->showMessage(tr("Message sent"), 5000);
// statusBar()->showMessage(tr("Message sent"), 5000); // no status bar
});
connect(m_mailService, &MailService::mailSendFailed, this, [this](const QString &, const QString &error) {
statusBar()->showMessage(tr("Send failed: %1").arg(error), 8000);
// statusBar()->showMessage(tr("Send failed: %1").arg(error), 8000); // no status bar
});
// Provide account service to settings view
m_settingsView->setAccountService(m_accountService);
@@ -66,6 +64,16 @@ void MainMainWindow::setupUI()
// === Central widget ===
QWidget *central = new QWidget();
central->setObjectName("CentralWidget");
central->setStyleSheet(
"QWidget#CentralWidget {"
" background-color: #f5f5f7;"
" border-bottom-left-radius: 8px;"
" border-bottom-right-radius: 8px;"
"}"
);
// Install event filter to handle resize from window edges
central->installEventFilter(this);
QHBoxLayout *centralLayout = new QHBoxLayout(central);
centralLayout->setContentsMargins(0, 0, 0, 0);
centralLayout->setSpacing(0);
@@ -590,10 +598,9 @@ void MainMainWindow::showTemplatesManager()
void MainMainWindow::createTitleBar()
{
// Enable frameless window
setWindowFlags(Qt::FramelessWindowHint | Qt::WindowMinMaxButtonsHint | Qt::WindowCloseButtonHint);
Qt::WindowFlags flags = Qt::Window | Qt::FramelessWindowHint | Qt::WindowMinMaxButtonsHint | Qt::WindowCloseButtonHint;
setWindowFlags(flags);
// Set Resizeable
setWindowFlags(windowFlags() | Qt::WindowMaximizeButtonHint);
#ifdef Q_OS_WIN
HWND hwnd = (HWND)this->winId();
DWORD style = ::GetWindowLong(hwnd, GWL_STYLE);
@@ -601,10 +608,10 @@ void MainMainWindow::createTitleBar()
#endif
// Remove status bar (item 4)
//setStatusBar(nullptr);
setStatusBar(nullptr);
// Apply rounded corners and border to main window (items 1, 2)
setAttribute(Qt::WA_TranslucentBackground);
// Use mask for rounded corners instead of WA_TranslucentBackground to avoid black corners
setStyleSheet(
"MainMainWindow {"
" background-color: #f5f5f7;"
@@ -896,18 +903,40 @@ void MainMainWindow::changeEvent(QEvent *event)
void MainMainWindow::onProgressChanged(int percent)
{
if (percent < 0 || percent > 100) {
m_progressBar->setVisible(false);
return;
Q_UNUSED(percent);
// No progress bar in status bar anymore
}
bool MainMainWindow::eventFilter(QObject *watched, QEvent *event)
{
// Handle resize from central widget edges
if (watched == centralWidget()) {
if (event->type() == QEvent::MouseButtonPress) {
QMouseEvent *me = static_cast<QMouseEvent*>(event);
if (me->button() == Qt::LeftButton) {
// Forward to main window's mousePressEvent
mousePressEvent(me);
return true;
}
} else if (event->type() == QEvent::MouseMove) {
QMouseEvent *me = static_cast<QMouseEvent*>(event);
mouseMoveEvent(me);
return true;
} else if (event->type() == QEvent::MouseButtonRelease) {
QMouseEvent *me = static_cast<QMouseEvent*>(event);
if (me->button() == Qt::LeftButton) {
mouseReleaseEvent(me);
return true;
}
}
}
m_progressBar->setValue(percent);
m_progressBar->setVisible(true);
return QMainWindow::eventFilter(watched, event);
}
void MainMainWindow::onStatusMessage(const QString &msg)
{
// Show temporary message in status bar (timeout 5000 ms)
statusBar()->showMessage(msg, 5000);
Q_UNUSED(msg);
// No status bar anymore
}
void MainMainWindow::onAddAccountRequested()
+1 -2
View File
@@ -42,6 +42,7 @@ protected:
void mouseReleaseEvent(QMouseEvent *event) override;
bool nativeEvent(const QByteArray &eventType, void *message, qintptr *result) override;
void changeEvent(QEvent *event) override;
bool eventFilter(QObject *watched, QEvent *event) override;
private slots:
void onNavChanged(int index);
@@ -144,6 +145,4 @@ private:
int m_currentFolderId;
int m_currentMailId;
QProgressBar *m_progressBar;
};