#include "mainwindow.h" #include "bottombuttongroup.h" #include "graphicsview.h" #include #include #include #include #include #ifdef _WIN32 #include #endif // _WIN32 MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent) { this->setWindowFlags(Qt::Window | Qt::FramelessWindowHint); this->setAttribute(Qt::WA_TranslucentBackground, true); this->setMinimumSize(610, 410); m_fadeOutAnimation = new QPropertyAnimation(this, "windowOpacity"); m_fadeOutAnimation->setDuration(300); m_fadeOutAnimation->setStartValue(1); m_fadeOutAnimation->setEndValue(0); m_floatUpAnimation = new QPropertyAnimation(this, "geometry"); m_floatUpAnimation->setDuration(300); m_floatUpAnimation->setEasingCurve(QEasingCurve::OutCirc); m_exitAnimationGroup = new QParallelAnimationGroup; m_exitAnimationGroup->addAnimation(m_fadeOutAnimation); m_exitAnimationGroup->addAnimation(m_floatUpAnimation); connect(m_exitAnimationGroup, &QParallelAnimationGroup::finished, this, &QMainWindow::close); QGraphicsScene * scene = new QGraphicsScene(this); QGraphicsTextItem * textItem = scene->addText("Hello, world!"); textItem->setDefaultTextColor(QColor("White")); GraphicsView * pictureView = new GraphicsView(this); pictureView->setScene(scene); this->setCentralWidget(pictureView); m_closeButton = new QPushButton(pictureView); m_closeButton->setFlat(true); m_closeButton->setFixedSize(50, 50); m_closeButton->setStyleSheet("QPushButton {" "background: transparent;" "}" "QPushButton:hover {" "background: red;" "}"); connect(m_closeButton, &QAbstractButton::clicked, this, &MainWindow::closeWindow); m_bottomButtonGroup = new BottomButtonGroup(this); } MainWindow::~MainWindow() { } void MainWindow::showEvent(QShowEvent *event) { updateWidgetsPosition(); return QMainWindow::showEvent(event); } void MainWindow::mousePressEvent(QMouseEvent *event) { if (event->buttons() & Qt::LeftButton) { m_clickedOnWindow = true; m_oldMousePos = event->pos(); qDebug() << m_oldMousePos; event->accept(); } return QMainWindow::mousePressEvent(event); } void MainWindow::mouseMoveEvent(QMouseEvent *event) { if (event->buttons() & Qt::LeftButton && m_clickedOnWindow) { move(event->globalPos() - m_oldMousePos); event->accept(); } return QMainWindow::mouseMoveEvent(event); } void MainWindow::mouseReleaseEvent(QMouseEvent *event) { m_clickedOnWindow = false; return QMainWindow::mouseReleaseEvent(event); } void MainWindow::mouseDoubleClickEvent(QMouseEvent *event) { closeWindow(); return QMainWindow::mouseDoubleClickEvent(event); } void MainWindow::resizeEvent(QResizeEvent *event) { updateWidgetsPosition(); return QMainWindow::resizeEvent(event); } bool MainWindow::nativeEvent(const QByteArray &eventType, void *message, long *result) { #ifdef _WIN32 // https://stackoverflow.com/questions/6649936/c-compiling-on-windows-and-linux-ifdef-switch // Too lazy to do this now.. just stackoverflow it and did a copy and paste.. Q_UNUSED(eventType); MSG* msg = static_cast(message); if (msg->message == WM_NCHITTEST) { if (isMaximized()) { return false; } *result = 0; const LONG borderWidth = 8; RECT winrect; GetWindowRect(reinterpret_cast(winId()), &winrect); // must be short to correctly work with multiple monitors (negative coordinates) short x = msg->lParam & 0x0000FFFF; short y = (msg->lParam & 0xFFFF0000) >> 16; bool resizeWidth = minimumWidth() != maximumWidth(); bool resizeHeight = minimumHeight() != maximumHeight(); if (resizeWidth) { //left border if (x >= winrect.left && x < winrect.left + borderWidth) { *result = HTLEFT; } //right border if (x < winrect.right && x >= winrect.right - borderWidth) { *result = HTRIGHT; } } if (resizeHeight) { //bottom border if (y < winrect.bottom && y >= winrect.bottom - borderWidth) { *result = HTBOTTOM; } //top border if (y >= winrect.top && y < winrect.top + borderWidth) { *result = HTTOP; } } if (resizeWidth && resizeHeight) { //bottom left corner if (x >= winrect.left && x < winrect.left + borderWidth && y < winrect.bottom && y >= winrect.bottom - borderWidth) { *result = HTBOTTOMLEFT; } //bottom right corner if (x < winrect.right && x >= winrect.right - borderWidth && y < winrect.bottom && y >= winrect.bottom - borderWidth) { *result = HTBOTTOMRIGHT; } //top left corner if (x >= winrect.left && x < winrect.left + borderWidth && y >= winrect.top && y < winrect.top + borderWidth) { *result = HTTOPLEFT; } //top right corner if (x < winrect.right && x >= winrect.right - borderWidth && y >= winrect.top && y < winrect.top + borderWidth) { *result = HTTOPRIGHT; } } if (*result != 0) return true; QWidget *action = QApplication::widgetAt(QCursor::pos()); if (action == this) { *result = HTCAPTION; return true; } } return false; #else return QMainWindow::nativeEvent(eventType, *message, *result); #endif // _WIN32 } void MainWindow::closeWindow() { QRect windowRect(this->geometry()); m_floatUpAnimation->setStartValue(windowRect); m_floatUpAnimation->setEndValue(windowRect.adjusted(0, -80, 0, 0)); m_floatUpAnimation->setStartValue(QRect(this->geometry().x(), this->geometry().y(), this->geometry().width(), this->geometry().height())); m_floatUpAnimation->setEndValue(QRect(this->geometry().x(), this->geometry().y()-80, this->geometry().width(), this->geometry().height())); m_exitAnimationGroup->start(); } void MainWindow::updateWidgetsPosition() { m_closeButton->move(width() - m_closeButton->width(), 0); m_bottomButtonGroup->move((width() - m_bottomButtonGroup->width()) / 2, height() - m_bottomButtonGroup->height()); }