Browse Source

fixed an error with darkstyle submodule... its not a submodule anymore

since i applied changes to it... maybe i can make a fork..
merge-requests/2/merge
_xeroxz 1 year ago
parent
commit
efb44199d6
  1. 3
      .gitmodules
  2. 1
      dependencies/DarkStyle
  3. 2
      dependencies/vmprofiler
  4. 40
      src/darkstyle/.gitignore
  5. 73
      src/darkstyle/DarkStyle.cpp
  6. 39
      src/darkstyle/DarkStyle.h
  7. 104
      src/darkstyle/README.md
  8. 28
      src/darkstyle/darkstyle.qrc
  9. 343
      src/darkstyle/darkstyle/darkstyle.qss
  10. BIN
      src/darkstyle/darkstyle/icon_branch_closed.png
  11. BIN
      src/darkstyle/darkstyle/icon_branch_end.png
  12. BIN
      src/darkstyle/darkstyle/icon_branch_more.png
  13. BIN
      src/darkstyle/darkstyle/icon_branch_open.png
  14. BIN
      src/darkstyle/darkstyle/icon_checkbox_checked.png
  15. BIN
      src/darkstyle/darkstyle/icon_checkbox_checked_disabled.png
  16. BIN
      src/darkstyle/darkstyle/icon_checkbox_checked_pressed.png
  17. BIN
      src/darkstyle/darkstyle/icon_checkbox_indeterminate.png
  18. BIN
      src/darkstyle/darkstyle/icon_checkbox_indeterminate_disabled.png
  19. BIN
      src/darkstyle/darkstyle/icon_checkbox_indeterminate_pressed.png
  20. BIN
      src/darkstyle/darkstyle/icon_checkbox_unchecked.png
  21. BIN
      src/darkstyle/darkstyle/icon_checkbox_unchecked_disabled.png
  22. BIN
      src/darkstyle/darkstyle/icon_checkbox_unchecked_pressed.png
  23. BIN
      src/darkstyle/darkstyle/icon_close.png
  24. BIN
      src/darkstyle/darkstyle/icon_radiobutton_checked.png
  25. BIN
      src/darkstyle/darkstyle/icon_radiobutton_checked_disabled.png
  26. BIN
      src/darkstyle/darkstyle/icon_radiobutton_checked_pressed.png
  27. BIN
      src/darkstyle/darkstyle/icon_radiobutton_unchecked.png
  28. BIN
      src/darkstyle/darkstyle/icon_radiobutton_unchecked_disabled.png
  29. BIN
      src/darkstyle/darkstyle/icon_radiobutton_unchecked_pressed.png
  30. BIN
      src/darkstyle/darkstyle/icon_restore.png
  31. BIN
      src/darkstyle/darkstyle/icon_undock.png
  32. BIN
      src/darkstyle/darkstyle/icon_vline.png
  33. 38
      src/darkstyle/frameless_window_dark.pro
  34. 8
      src/darkstyle/framelesswindow.qrc
  35. 458
      src/darkstyle/framelesswindow/framelesswindow.cpp
  36. 69
      src/darkstyle/framelesswindow/framelesswindow.h
  37. 304
      src/darkstyle/framelesswindow/framelesswindow.ui
  38. 56
      src/darkstyle/framelesswindow/windowdragger.cpp
  39. 43
      src/darkstyle/framelesswindow/windowdragger.h
  40. BIN
      src/darkstyle/images/icon_window_close.png
  41. BIN
      src/darkstyle/images/icon_window_maximize.png
  42. BIN
      src/darkstyle/images/icon_window_minimize.png
  43. BIN
      src/darkstyle/images/icon_window_restore.png
  44. 40
      src/darkstyle/main.cpp
  45. 23
      src/darkstyle/mainwindow.cpp
  46. 34
      src/darkstyle/mainwindow.h
  47. 645
      src/darkstyle/mainwindow.ui
  48. BIN
      src/darkstyle/screenshot_mac_frameless_window_qt_dark_style_disabled.png
  49. BIN
      src/darkstyle/screenshot_mac_frameless_window_qt_dark_style_enabled.png
  50. BIN
      src/darkstyle/screenshot_win7_frameless_window_qt_dark_style_enabled.png
  51. 28
      vmprofiler-qt.vcxproj
  52. 30
      vmprofiler-qt.vcxproj.filters

3
.gitmodules vendored

@ -1,9 +1,6 @@
[submodule "dependencies/vmprofiler"]
path = dependencies/vmprofiler
url = https://githacks.org/vmp2/vmprofiler.git
[submodule "dependencies/DarkStyle"]
path = dependencies/DarkStyle
url = https://github.com/Jorgen-VikingGod/Qt-Frameless-Window-DarkStyle.git
[submodule "dependencies/ia32-doc"]
path = dependencies/ia32-doc
url = https://github.com/wbenny/ia32-doc.git

1
dependencies/DarkStyle vendored

@ -1 +0,0 @@
Subproject commit 79425f53ef154ea33faf4e2964f5762645b54d91

2
dependencies/vmprofiler vendored

@ -1 +1 @@
Subproject commit e95ef2537184639e89a4dbbd38355a11ffc46bac
Subproject commit c8ff24a8b44466dd2a9e2e342c83774b61004eb5

40
src/darkstyle/.gitignore vendored

@ -0,0 +1,40 @@
# C++ objects and libs
*.slo
*.lo
*.o
*.a
*.la
*.lai
*.so
*.dll
*.dylib
# Qt-es
/.qmake.cache
/.qmake.stash
*.pro.user
*.pro.user.*
*.qbs.user
*.qbs.user.*
*.moc
moc_*.cpp
moc_*.h
qrc_*.cpp
ui_*.h
Makefile*
*build-*
# QtCreator
*.autosave
# QtCtreator Qml
*.qmlproject.user
*.qmlproject.user.*
# QtCtreator CMake
CMakeLists.txt.user*
.directory

73
src/darkstyle/DarkStyle.cpp

@ -0,0 +1,73 @@
/*
###############################################################################
# #
# The MIT License #
# #
# Copyright (C) 2017 by Juergen Skrotzky ([email protected]) #
# >> https://github.com/Jorgen-VikingGod #
# #
# Sources: https://github.com/Jorgen-VikingGod/Qt-Frameless-Window-DarkStyle #
# #
###############################################################################
*/
#include "DarkStyle.h"
DarkStyle::DarkStyle() : DarkStyle(styleBase()) {}
DarkStyle::DarkStyle(QStyle *style) : QProxyStyle(style) {}
QStyle *DarkStyle::styleBase(QStyle *style) const {
static QStyle *base =
!style ? QStyleFactory::create(QStringLiteral("Fusion")) : style;
return base;
}
QStyle *DarkStyle::baseStyle() const { return styleBase(); }
void DarkStyle::polish(QPalette &palette) {
// modify palette to dark
palette.setColor(QPalette::Window, QColor(53, 53, 53));
palette.setColor(QPalette::WindowText, Qt::white);
palette.setColor(QPalette::Disabled, QPalette::WindowText,
QColor(127, 127, 127));
palette.setColor(QPalette::Base, QColor(42, 42, 42));
palette.setColor(QPalette::AlternateBase, QColor(66, 66, 66));
palette.setColor(QPalette::ToolTipBase, Qt::white);
palette.setColor(QPalette::ToolTipText, QColor(53, 53, 53));
palette.setColor(QPalette::Text, Qt::white);
palette.setColor(QPalette::Disabled, QPalette::Text, QColor(127, 127, 127));
palette.setColor(QPalette::Dark, QColor(35, 35, 35));
palette.setColor(QPalette::Shadow, QColor(20, 20, 20));
palette.setColor(QPalette::Button, QColor(53, 53, 53));
palette.setColor(QPalette::ButtonText, Qt::white);
palette.setColor(QPalette::Disabled, QPalette::ButtonText,
QColor(127, 127, 127));
palette.setColor(QPalette::BrightText, Qt::red);
palette.setColor(QPalette::Link, QColor(42, 130, 218));
palette.setColor(QPalette::Highlight, QColor(42, 130, 218));
palette.setColor(QPalette::Disabled, QPalette::Highlight, QColor(80, 80, 80));
palette.setColor(QPalette::HighlightedText, Qt::white);
palette.setColor(QPalette::Disabled, QPalette::HighlightedText,
QColor(127, 127, 127));
}
void DarkStyle::polish(QApplication *app) {
if (!app) return;
// increase font size for better reading,
// setPointSize was reduced from +2 because when applied this way in Qt5, the
// font is larger than intended for some reason
QFont defaultFont = QApplication::font();
defaultFont.setPointSize(defaultFont.pointSize() + 1);
app->setFont(defaultFont);
// loadstylesheet
QFile qfDarkstyle(QStringLiteral(":/darkstyle/darkstyle.qss"));
if (qfDarkstyle.open(QIODevice::ReadOnly | QIODevice::Text)) {
// set stylesheet
QString qsStylesheet = QString::fromLatin1(qfDarkstyle.readAll());
app->setStyleSheet(qsStylesheet);
qfDarkstyle.close();
}
}

39
src/darkstyle/DarkStyle.h

@ -0,0 +1,39 @@
/*
###############################################################################
# #
# The MIT License #
# #
# Copyright (C) 2017 by Juergen Skrotzky ([email protected]) #
# >> https://github.com/Jorgen-VikingGod #
# #
# Sources: https://github.com/Jorgen-VikingGod/Qt-Frameless-Window-DarkStyle #
# #
###############################################################################
*/
#ifndef DARKSTYLE_HPP
#define DARKSTYLE_HPP
#include <QApplication>
#include <QFile>
#include <QFont>
#include <QProxyStyle>
#include <QStyleFactory>
class DarkStyle : public QProxyStyle {
Q_OBJECT
public:
DarkStyle();
explicit DarkStyle(QStyle *style);
QStyle *baseStyle() const;
void polish(QPalette &palette) override;
void polish(QApplication *app) override;
private:
QStyle *styleBase(QStyle *style = Q_NULLPTR) const;
};
#endif // DARKSTYLE_HPP

104
src/darkstyle/README.md

@ -0,0 +1,104 @@
# Qt Frameless Window with DarkStyle
simple MainWindow class implementation with frameless window and custom dark style.
It adds also support for titlebar and buttons (minimize, maximize, close)
Look is based on the VS2013 application window (flat and frameless window)
<table>
<tr><th colspan="2">Screenshots</th></tr>
<tr><th>mac enabled</th><th>mac disabled</th></tr>
<tr>
<td><img src="https://github.com/Jorgen-VikingGod/Qt-Frameless-Window-DarkStyle/blob/master/screenshot_mac_frameless_window_qt_dark_style_enabled.png" title="screenshot mac frameless window qt dark style enabled" /></td>
<td><img src="https://github.com/Jorgen-VikingGod/Qt-Frameless-Window-DarkStyle/blob/master/screenshot_mac_frameless_window_qt_dark_style_disabled.png" title="screenshot mac frameless window qt dark style disabled" /></td>
</tr>
</table>
## Qt and OS
* tested with Qt5.5.0, Qt5.9.0 and Qt5.10.0
* tested on Windows 7, Windows 10,MacOSX 10.12.5 and MacOS 10.13.2
## PyQt5
Here is an [unofficial Python port](https://github.com/gmarull/qtmodern) of my implementation.
## How to use
* add additional include plath to **framelesswindow**
* add resources **framelesswindow.qrc** and **darkstyle.qrc**
* add ``#include "framelesswindow.h"`` into **main.cpp**, create window ``FramelessWindow framelessWindow;`` and assign your mainwindow object as content ``framelessWindow.setContent(mainWindow);`` and show it ``framelessWindow.show();``
* add ``#include "DarkStyle.h"`` into **main.cpp** and call ``a.setStyle(new DarkStyle);``
```qt
#include <QApplication>
#include "DarkStyle.h"
#include "framelesswindow.h"
#include "mainwindow.h"
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
// style our application with custom dark style
QApplication::setStyle(new DarkStyle);
//QApplication::setPalette(QApplication::style()->standardPalette());
// create frameless window (and set windowState or title)
FramelessWindow framelessWindow;
//framelessWindow.setWindowState(Qt::WindowMaximized);
//framelessWindow.setWindowTitle("test title");
//framelessWindow.setWindowIcon(a.style()->standardIcon(QStyle::SP_DesktopIcon));
// create our mainwindow instance
MainWindow *mainWindow = new MainWindow;
// add the mainwindow to our custom frameless window
framelessWindow.setContent(mainWindow);
framelessWindow.show();
return a.exec();
}
```
## features
* frameless window
* custom dark style (based on **Fusion style** with dark palette and custom stylesheets)
* title bar
* buttons (minimize | restore | maximize | close)
* move window by drag the title bar
* dobule click title bar to toggle between window styte (maximize and normal)
* use of native events, like minimizing or system menu
## todo
* [ ] [resize window on each corner [#1]](https://github.com/Jorgen-VikingGod/Qt-Frameless-Window-DarkStyle/issues/1) (some work done by [notecola](https://github.com/notecola) :+1:)
* [ ] [snap on screen edges [#3]](https://github.com/Jorgen-VikingGod/Qt-Frameless-Window-DarkStyle/issues/3)
## thanks
Many thanks goes to the [Qt Forum](https://forum.qt.io/topic/80654/how-to-create-vs2013-like-frameless-window-with-dark-style) and especially to [Chris Kawa](https://forum.qt.io/user/chris-kawa) for pointing me to some usual issues and hints of great must have features.
## Licence
> The MIT License
>
> Copyright (c) 2018, Juergen Skrotzky (https://github.com/Jorgen-VikingGod, [email protected])
>
> Permission is hereby granted, free of charge, to any person obtaining a copy
> of this software and associated documentation files (the "Software"), to deal
> in the Software without restriction, including without limitation the rights
> to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
> copies of the Software, and to permit persons to whom the Software is
> furnished to do so, subject to the following conditions:
>
> The above copyright notice and this permission notice shall be included in
> all copies or substantial portions of the Software.
>
> THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
> IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
> FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
> AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
> LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
> OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
> THE SOFTWARE.

28
src/darkstyle/darkstyle.qrc

@ -0,0 +1,28 @@
<RCC>
<qresource prefix="/">
<file>darkstyle/darkstyle.qss</file>
<file>darkstyle/icon_close.png</file>
<file>darkstyle/icon_restore.png</file>
<file>darkstyle/icon_undock.png</file>
<file>darkstyle/icon_branch_closed.png</file>
<file>darkstyle/icon_branch_end.png</file>
<file>darkstyle/icon_branch_more.png</file>
<file>darkstyle/icon_branch_open.png</file>
<file>darkstyle/icon_vline.png</file>
<file>darkstyle/icon_checkbox_checked.png</file>
<file>darkstyle/icon_checkbox_indeterminate.png</file>
<file>darkstyle/icon_checkbox_unchecked.png</file>
<file>darkstyle/icon_checkbox_checked_pressed.png</file>
<file>darkstyle/icon_checkbox_indeterminate_pressed.png</file>
<file>darkstyle/icon_checkbox_unchecked_pressed.png</file>
<file>darkstyle/icon_checkbox_checked_disabled.png</file>
<file>darkstyle/icon_checkbox_indeterminate_disabled.png</file>
<file>darkstyle/icon_checkbox_unchecked_disabled.png</file>
<file>darkstyle/icon_radiobutton_checked.png</file>
<file>darkstyle/icon_radiobutton_unchecked.png</file>
<file>darkstyle/icon_radiobutton_checked_pressed.png</file>
<file>darkstyle/icon_radiobutton_unchecked_pressed.png</file>
<file>darkstyle/icon_radiobutton_checked_disabled.png</file>
<file>darkstyle/icon_radiobutton_unchecked_disabled.png</file>
</qresource>
</RCC>

343
src/darkstyle/darkstyle/darkstyle.qss

@ -0,0 +1,343 @@
QToolTip{
color:#ffffff;
background-color:palette(base);
border:1px solid palette(highlight);
border-radius:4px;
}
QStatusBar{
background-color:qlineargradient(x1:0,y1:0,x2:0,y2:1,stop:0 rgba(25,25,25,127),stop:1 rgba(53,53,53,75));
color:palette(mid);
}
QMenuBar{
background-color:qlineargradient(x1:0,y1:0,x2:0,y2:1,stop:0 rgba(25,25,25,127),stop:1 rgba(53,53,53,75));
border-bottom:2px solid rgba(25,25,25,75);
}
QMenuBar::item{
spacing:2px;
padding:3px 4px;
background:transparent;
}
QMenuBar::item:selected{
background-color:qlineargradient(x1:0,y1:0,x2:0,y2:1,stop:0 rgba(106,106,106,255),stop:1 rgba(106,106,106,75));
border-left:1px solid rgba(106,106,106,127);
border-right:1px solid rgba(106,106,106,127);
}
QMenuBar::item:pressed{
background-color:palette(highlight);
border-left:1px solid rgba(25,25,25,127);
border-right:1px solid rgba(25,25,25,127);
}
QMenu{
background-color:palette(window);
border:1px solid palette(shadow);
}
QMenu::item{
padding:3px 25px 3px 25px;
border:1px solid transparent;
}
QMenu::item:disabled{
background-color:rgba(35,35,35,127);
color:palette(disabled);
}
QMenu::item:selected{
border-color:rgba(147,191,236,127);
background:palette(highlight);
}
QMenu::icon:checked{
background-color:qlineargradient(x1:0,y1:1,x2:0,y2:0,stop:0 rgba(25,25,25,127),stop:1 rgba(53,53,53,75));
border:1px solid palette(highlight);
border-radius:2px;
}
QMenu::separator{
height:1px;
background:palette(alternate-base);
margin-left:5px;
margin-right:5px;
}
QMenu::indicator{
width:18px;
height:18px;
}
QMenu::indicator:non-exclusive:checked{
image:url(:/darkstyle/icon_checkbox_checked.png);
padding-left:2px;
}
QMenu::indicator:non-exclusive:unchecked{
image:url(:/darkstyle/icon_checkbox_unchecked.png);
padding-left:2px;
}
QMenu::indicator:exclusive:checked{
image:url(:/darkstyle/icon_radiobutton_checked.png);
padding-left:2px;
}
QMenu::indicator:exclusive:unchecked{
image:url(:/darkstyle/icon_radiobutton_unchecked.png);
padding-left:2px;
}
QToolBar::top{
background-color:qlineargradient(x1:0,y1:0,x2:0,y2:1,stop:0 rgba(25,25,25,127),stop:1 rgba(53,53,53,75));
border-bottom:3px solid qlineargradient(x1:0,y1:0,x2:0,y2:1,stop:0 rgba(25,25,25,127),stop:1 rgba(53,53,53,75));
}
QToolBar::bottom{
background-color:qlineargradient(x1:0,y1:1,x2:0,y2:0,stop:0 rgba(25,25,25,127),stop:1 rgba(53,53,53,75));
border-top:3px solid qlineargradient(x1:0,y1:1,x2:0,y2:0,stop:0 rgba(25,25,25,127),stop:1 rgba(53,53,53,75));
}
QToolBar::left{
background-color:qlineargradient(x1:0,y1:0,x2:1,y2:0,stop:0 rgba(25,25,25,127),stop:1 rgba(53,53,53,75));
border-right:3px solid qlineargradient(x1:0,y1:0,x2:1,y2:0,stop:0 rgba(25,25,25,127),stop:1 rgba(53,53,53,75));
}
QToolBar::right{
background-color:qlineargradient(x1:1,y1:0,x2:0,y2:0,stop:0 rgba(25,25,25,127),stop:1 rgba(53,53,53,75));
border-left:3px solid qlineargradient(x1:1,y1:0,x2:0,y2:0,stop:0 rgba(25,25,25,127),stop:1 rgba(53,53,53,75));
}
QMainWindow::separator{
width:6px;
height:5px;
padding:2px;
}
QSplitter::handle:horizontal{
width:10px;
}
QSplitter::handle:vertical{
height:10px;
}
QMainWindow::separator:hover,QSplitter::handle:hover{
background:palette(highlight);
}
QDockWidget::title{
padding:4px;
background-color:qlineargradient(x1:0,y1:1,x2:0,y2:0,stop:0 rgba(25,25,25,127),stop:1 rgba(53,53,53,75));
border:1px solid rgba(25,25,25,75);
border-bottom:2px solid rgba(25,25,25,75);
}
QDockWidget{
titlebar-close-icon:url(:/darkstyle/icon_close.png);
titlebar-normal-icon:url(:/darkstyle/icon_restore.png);
}
QDockWidget::close-button,QDockWidget::float-button{
subcontrol-position:top right;
subcontrol-origin:margin;
position:absolute;
top:3px;
bottom:0px;
width:20px;
height:20px;
}
QDockWidget::close-button{
right:3px;
}
QDockWidget::float-button{
right:25px;
}
QGroupBox{
background-color:rgba(66,66,66,50%);
margin-top:27px;
border:1px solid rgba(25,25,25,127);
border-radius:4px;
}
QGroupBox::title{
subcontrol-origin:margin;
subcontrol-position:left top;
padding:4px 6px;
margin-left:3px;
background-color:qlineargradient(x1:0,y1:1,x2:0,y2:0,stop:0 rgba(25,25,25,127),stop:1 rgba(53,53,53,75));
border:1px solid rgba(25,25,25,75);
border-bottom:2px solid rgb(127,127,127);
border-top-left-radius:4px;
border-top-right-radius:4px;
}
QTabWidget::pane{
background-color:rgba(66,66,66,50%);
border-top:1px solid rgba(25,25,25,50%);
}
QTabWidget::tab-bar{
left:3px;
top:1px;
}
QTabBar{
background-color:transparent;
qproperty-drawBase:0;
border-bottom:1px solid rgba(25,25,25,50%);
}
QTabBar::tab{
padding:4px 6px;
background-color:qlineargradient(x1:0,y1:1,x2:0,y2:0,stop:0 rgba(25,25,25,127),stop:1 rgba(53,53,53,75));
border:1px solid rgba(25,25,25,75);
border-top-left-radius:4px;
border-top-right-radius:4px;
}
QTabBar::tab:selected,QTabBar::tab:hover{
background-color:qlineargradient(x1:0,y1:0,x2:0,y2:1,stop:0 rgba(53,53,53,127),stop:1 rgba(66,66,66,50%));
border-bottom-color:rgba(66,66,66,75%);
}
QTabBar::tab:selected{
border-bottom:2px solid palette(highlight);
}
QTabBar::tab::selected:disabled{
border-bottom:2px solid rgb(127,127,127);
}
QTabBar::tab:!selected{
margin-top:2px;
}
QCheckBox::indicator{
width:18px;
height:18px;
}
QCheckBox::indicator:checked,QTreeView::indicator:checked,QTableView::indicator:checked,QGroupBox::indicator:checked{
image:url(:/darkstyle/icon_checkbox_checked.png);
}
QCheckBox::indicator:checked:pressed,QTreeView::indicator:checked:pressed,QTableView::indicator:checked:pressed,QGroupBox::indicator:checked:pressed{
image:url(:/darkstyle/icon_checkbox_checked_pressed.png);
}
QCheckBox::indicator:checked:disabled,QTreeView::indicator:checked:disabled,QTableView::indicator:checked:disabled,QGroupBox::indicator:checked:disabled{
image:url(:/darkstyle/icon_checkbox_checked_disabled.png);
}
QCheckBox::indicator:unchecked,QTreeView::indicator:unchecked,QTableView::indicator:unchecked,QGroupBox::indicator:unchecked{
image:url(:/darkstyle/icon_checkbox_unchecked.png);
}
QCheckBox::indicator:unchecked:pressed,QTreeView::indicator:unchecked:pressed,QTableView::indicator:unchecked:pressed,QGroupBox::indicator:unchecked:pressed{
image:url(:/darkstyle/icon_checkbox_unchecked_pressed.png);
}
QCheckBox::indicator:unchecked:disabled,QTreeView::indicator:unchecked:disabled,QTableView::indicator:unchecked:disabled,QGroupBox::indicator:unchecked:disabled{
image:url(:/darkstyle/icon_checkbox_unchecked_disabled.png);
}
QCheckBox::indicator:indeterminate,QTreeView::indicator:indeterminate,QTableView::indicator:indeterminate,QGroupBox::indicator:indeterminate{
image:url(:/darkstyle/icon_checkbox_indeterminate.png);
}
QCheckBox::indicator:indeterminate:pressed,QTreeView::indicator:indeterminate:pressed,QTableView::indicator:indeterminate:pressed,QGroupBox::indicator:indeterminate:pressed{
image:url(:/darkstyle/icon_checkbox_indeterminate_pressed.png);
}
QCheckBox::indicator:indeterminate:disabled,QTreeView::indicator:indeterminate:disabled,QTableView::indicator:indeterminate:disabled,QGroupBox::indicator:indeterminate:disabled{
image:url(:/darkstyle/icon_checkbox_indeterminate_disabled.png);
}
QRadioButton::indicator{
width:18px;
height:18px;
}
QRadioButton::indicator:checked{
image:url(:/darkstyle/icon_radiobutton_checked.png);
}
QRadioButton::indicator:checked:pressed{
image:url(:/darkstyle/icon_radiobutton_checked_pressed.png);
}
QRadioButton::indicator:checked:disabled{
image:url(:/darkstyle/icon_radiobutton_checked_disabled.png);
}
QRadioButton::indicator:unchecked{
image:url(:/darkstyle/icon_radiobutton_unchecked.png);
}
QRadioButton::indicator:unchecked:pressed{
image:url(:/darkstyle/icon_radiobutton_unchecked_pressed.png);
}
QRadioButton::indicator:unchecked:disabled{
image:url(:/darkstyle/icon_radiobutton_unchecked_disabled.png);
}
QTreeView, QTableView{
alternate-background-color:palette(window);
background:palette(base);
}
QTreeView QHeaderView::section, QTableView QHeaderView::section{
background-color:qlineargradient(x1:0,y1:1,x2:0,y2:0,stop:0 rgba(25,25,25,127),stop:1 rgba(53,53,53,75));
border-style:none;
border-bottom:1px solid palette(dark);
padding-left:5px;
padding-right:5px;
}
QTreeView::item:selected:disabled, QTableView::item:selected:disabled{
background:rgb(80,80,80);
}
QTreeView::branch{
background-color:palette(base);
}
QTreeView::branch:has-siblings:!adjoins-item{
border-image:url(:/darkstyle/icon_vline.png) 0;
}
QTreeView::branch:has-siblings:adjoins-item{
border-image:url(:/darkstyle/icon_branch_more.png) 0;
}
QTreeView::branch:!has-children:!has-siblings:adjoins-item{
border-image:url(:/darkstyle/icon_branch_end.png) 0;
}
QTreeView::branch:has-children:!has-siblings:closed,
QTreeView::branch:closed:has-children:has-siblings{
border-image:none;
image:url(:/darkstyle/icon_branch_closed.png);
}
QTreeView::branch:open:has-children:!has-siblings,
QTreeView::branch:open:has-children:has-siblings{
border-image:none;
image:url(:/darkstyle/icon_branch_open.png);
}
QScrollBar:vertical{
background:palette(base);
border-top-right-radius:2px;
border-bottom-right-radius:2px;
width:16px;
margin:0px;
}
QScrollBar::handle:vertical{
background-color:palette(alternate-base);
border-radius:2px;
min-height:20px;
margin:2px 4px 2px 4px;
}
QScrollBar::handle:vertical:hover{
background-color:palette(highlight);
}
QScrollBar::add-line:vertical{
background:none;
height:0px;
subcontrol-position:right;
subcontrol-origin:margin;
}
QScrollBar::sub-line:vertical{
background:none;
height:0px;
subcontrol-position:left;
subcontrol-origin:margin;
}
QScrollBar:horizontal{
background:palette(base);
height:16px;
margin:0px;
}
QScrollBar::handle:horizontal{
background-color:palette(alternate-base);
border-radius:2px;
min-width:20px;
margin:4px 2px 4px 2px;
}
QScrollBar::handle:horizontal:hover{
background-color:palette(highlight);
}
QScrollBar::add-line:horizontal{
background:none;
width:0px;
subcontrol-position:bottom;
subcontrol-origin:margin;
}
QScrollBar::sub-line:horizontal{
background:none;
width:0px;
subcontrol-position:top;
subcontrol-origin:margin;
}
QSlider::handle:horizontal{
border-radius:4px;
border:1px solid rgba(25,25,25,255);
background-color:palette(alternate-base);
min-height:20px;
margin:0 -4px;
}
QSlider::handle:horizontal:hover{
background:palette(highlight);
}
QSlider::add-page:horizontal{
background:palette(base);
}
QSlider::sub-page:horizontal{
background:palette(highlight);
}
QSlider::sub-page:horizontal:disabled{
background:rgb(80,80,80);
}

BIN
src/darkstyle/darkstyle/icon_branch_closed.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 310 B

BIN
src/darkstyle/darkstyle/icon_branch_end.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 358 B

BIN
src/darkstyle/darkstyle/icon_branch_more.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 207 B

BIN
src/darkstyle/darkstyle/icon_branch_open.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 313 B

BIN
src/darkstyle/darkstyle/icon_checkbox_checked.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 176 B

BIN
src/darkstyle/darkstyle/icon_checkbox_checked_disabled.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 373 B

BIN
src/darkstyle/darkstyle/icon_checkbox_checked_pressed.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 373 B

BIN
src/darkstyle/darkstyle/icon_checkbox_indeterminate.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 121 B

BIN
src/darkstyle/darkstyle/icon_checkbox_indeterminate_disabled.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 286 B

BIN
src/darkstyle/darkstyle/icon_checkbox_indeterminate_pressed.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 286 B

BIN
src/darkstyle/darkstyle/icon_checkbox_unchecked.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 119 B

BIN
src/darkstyle/darkstyle/icon_checkbox_unchecked_disabled.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 238 B

BIN
src/darkstyle/darkstyle/icon_checkbox_unchecked_pressed.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 238 B

BIN
src/darkstyle/darkstyle/icon_close.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 422 B

BIN
src/darkstyle/darkstyle/icon_radiobutton_checked.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 370 B

BIN
src/darkstyle/darkstyle/icon_radiobutton_checked_disabled.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 617 B

BIN
src/darkstyle/darkstyle/icon_radiobutton_checked_pressed.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 616 B

BIN
src/darkstyle/darkstyle/icon_radiobutton_unchecked.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 310 B

BIN
src/darkstyle/darkstyle/icon_radiobutton_unchecked_disabled.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 538 B

BIN
src/darkstyle/darkstyle/icon_radiobutton_unchecked_pressed.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 537 B

BIN
src/darkstyle/darkstyle/icon_restore.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 404 B

BIN
src/darkstyle/darkstyle/icon_undock.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 424 B

BIN
src/darkstyle/darkstyle/icon_vline.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 303 B

38
src/darkstyle/frameless_window_dark.pro

@ -0,0 +1,38 @@
###############################################################################
# #
# The MIT License #
# #
# Copyright (C) 2017 by Juergen Skrotzky (JorgenVikingGod@gmail.com) #
# >> https://github.com/Jorgen-VikingGod #
# #
# Sources: https://github.com/Jorgen-VikingGod/Qt-Frameless-Window-DarkStyle #
# #
###############################################################################
QT += core gui
greaterThan(QT_MAJOR_VERSION, 4): QT += widgets
INCLUDEPATH +="framelesswindow"
TARGET = QtFramelessWindowDarkStyle
TEMPLATE = app
SOURCES += main.cpp\
mainwindow.cpp \
framelesswindow/framelesswindow.cpp \
framelesswindow/windowdragger.cpp \
DarkStyle.cpp
HEADERS += mainwindow.h \
framelesswindow/framelesswindow.h \
framelesswindow/windowdragger.h \
DarkStyle.h
FORMS += mainwindow.ui \
framelesswindow/framelesswindow.ui
RESOURCES += darkstyle.qrc \
framelesswindow.qrc

8
src/darkstyle/framelesswindow.qrc

@ -0,0 +1,8 @@
<RCC>
<qresource prefix="/">
<file>images/icon_window_minimize.png</file>
<file>images/icon_window_restore.png</file>
<file>images/icon_window_maximize.png</file>
<file>images/icon_window_close.png</file>
</qresource>
</RCC>

458
src/darkstyle/framelesswindow/framelesswindow.cpp

@ -0,0 +1,458 @@
/*
###############################################################################
# #
# The MIT License #
# #
# Copyright (C) 2017 by Juergen Skrotzky ([email protected]) #
# >> https://github.com/Jorgen-VikingGod #
# #
# Sources: https://github.com/Jorgen-VikingGod/Qt-Frameless-Window-DarkStyle #
# #
###############################################################################
*/
#include "framelesswindow.h"
#include <QApplication>
#include <QDesktopWidget>
#include <QGraphicsDropShadowEffect>
#include <QScreen>
#include "ui_framelesswindow.h"
FramelessWindow::FramelessWindow(QWidget *parent)
: QWidget(parent),
ui(new Ui::FramelessWindow),
m_bMousePressed(false),
m_bDragTop(false),
m_bDragLeft(false),
m_bDragRight(false),
m_bDragBottom(false) {
setWindowFlags(Qt::FramelessWindowHint | Qt::WindowSystemMenuHint);
// append minimize button flag in case of windows,
// for correct windows native handling of minimize function
#if defined(Q_OS_WIN)
setWindowFlags(windowFlags() | Qt::WindowMinimizeButtonHint);
#endif
setAttribute(Qt::WA_NoSystemBackground, true);
setAttribute(Qt::WA_TranslucentBackground);
ui->setupUi(this);
ui->restoreButton->setVisible(false);
// shadow under window title text
QGraphicsDropShadowEffect *textShadow = new QGraphicsDropShadowEffect;
textShadow->setBlurRadius(4.0);
textShadow->setColor(QColor(0, 0, 0));
textShadow->setOffset(0.0);
ui->titleText->setGraphicsEffect(textShadow);
// window shadow
QGraphicsDropShadowEffect *windowShadow = new QGraphicsDropShadowEffect;
windowShadow->setBlurRadius(9.0);
windowShadow->setColor(palette().color(QPalette::Highlight));
windowShadow->setOffset(0.0);
ui->windowFrame->setGraphicsEffect(windowShadow);
QObject::connect(qApp, &QGuiApplication::applicationStateChanged, this,
&FramelessWindow::on_applicationStateChanged);
setMouseTracking(true);
// important to watch mouse move from all child widgets
QApplication::instance()->installEventFilter(this);
}
FramelessWindow::~FramelessWindow() { delete ui; }
void FramelessWindow::on_restoreButton_clicked() {
ui->restoreButton->setVisible(false);
ui->maximizeButton->setVisible(true);
setWindowState(Qt::WindowNoState);
// on MacOS this hack makes sure the
// background window is repaint correctly
hide();
show();
}
void FramelessWindow::on_maximizeButton_clicked() {
ui->restoreButton->setVisible(true);
ui->maximizeButton->setVisible(false);
this->setWindowState(Qt::WindowMaximized);
this->showMaximized();
styleWindow(true, false);
}
void FramelessWindow::changeEvent(QEvent *event) {
if (event->type() == QEvent::WindowStateChange) {
if (windowState().testFlag(Qt::WindowNoState)) {
ui->restoreButton->setVisible(false);
ui->maximizeButton->setVisible(true);
styleWindow(true, true);
event->ignore();
} else if (windowState().testFlag(Qt::WindowMaximized)) {
ui->restoreButton->setVisible(true);
ui->maximizeButton->setVisible(false);
styleWindow(true, false);
event->ignore();
}
}
event->accept();
}
void FramelessWindow::setContent(QWidget *w) {
ui->windowContent->layout()->addWidget(w);
}
void FramelessWindow::setWindowTitle(const QString &text) {
ui->titleText->setText(text);
}
void FramelessWindow::setWindowIcon(const QIcon &ico) {
ui->icon->setPixmap(ico.pixmap(16, 16));
}
void FramelessWindow::styleWindow(bool bActive, bool bNoState) {
if (bActive) {
if (bNoState) {
layout()->setMargin(15);
ui->windowTitlebar->setStyleSheet(QStringLiteral(
"#windowTitlebar{border: 0px none palette(shadow); "
"border-top-left-radius:5px; border-top-right-radius:5px; "
"background-color:palette(shadow); height:20px;}"));
ui->windowFrame->setStyleSheet(QStringLiteral(
"#windowFrame{border:1px solid palette(highlight); border-radius:5px "
"5px 5px 5px; background-color:palette(Window);}"));
QGraphicsEffect *oldShadow = ui->windowFrame->graphicsEffect();
if (oldShadow) delete oldShadow;
QGraphicsDropShadowEffect *windowShadow = new QGraphicsDropShadowEffect;
windowShadow->setBlurRadius(9.0);
windowShadow->setColor(palette().color(QPalette::Highlight));
windowShadow->setOffset(0.0);
ui->windowFrame->setGraphicsEffect(windowShadow);
} else {
layout()->setMargin(0);
ui->windowTitlebar->setStyleSheet(QStringLiteral(
"#windowTitlebar{border: 0px none palette(shadow); "
"border-top-left-radius:0px; border-top-right-radius:0px; "
"background-color:palette(shadow); height:20px;}"));
ui->windowFrame->setStyleSheet(QStringLiteral(
"#windowFrame{border:1px solid palette(dark); border-radius:0px 0px "
"0px 0px; background-color:palette(Window);}"));
QGraphicsEffect *oldShadow = ui->windowFrame->graphicsEffect();
if (oldShadow) delete oldShadow;
ui->windowFrame->setGraphicsEffect(nullptr);
} // if (bNoState) else maximize
} else {
if (bNoState) {
layout()->setMargin(15);
ui->windowTitlebar->setStyleSheet(QStringLiteral(
"#windowTitlebar{border: 0px none palette(shadow); "
"border-top-left-radius:5px; border-top-right-radius:5px; "
"background-color:palette(dark); height:20px;}"));
ui->windowFrame->setStyleSheet(QStringLiteral(
"#windowFrame{border:1px solid #000000; border-radius:5px 5px 5px "
"5px; background-color:palette(Window);}"));
QGraphicsEffect *oldShadow = ui->windowFrame->graphicsEffect();
if (oldShadow) delete oldShadow;
QGraphicsDropShadowEffect *windowShadow = new QGraphicsDropShadowEffect;
windowShadow->setBlurRadius(9.0);
windowShadow->setColor(palette().color(QPalette::Shadow));
windowShadow->setOffset(0.0);
ui->windowFrame->setGraphicsEffect(windowShadow);
} else {
layout()->setMargin(0);
ui->windowTitlebar->setStyleSheet(QStringLiteral(
"#titlebarWidget{border: 0px none palette(shadow); "
"border-top-left-radius:0px; border-top-right-radius:0px; "
"background-color:palette(dark); height:20px;}"));
ui->windowFrame->setStyleSheet(QStringLiteral(
"#windowFrame{border:1px solid palette(shadow); border-radius:0px "
"0px 0px 0px; background-color:palette(Window);}"));
QGraphicsEffect *oldShadow = ui->windowFrame->graphicsEffect();
if (oldShadow) delete oldShadow;
ui->windowFrame->setGraphicsEffect(nullptr);
} // if (bNoState) { else maximize
} // if (bActive) { else no focus
}
void FramelessWindow::on_applicationStateChanged(Qt::ApplicationState state) {
if (windowState().testFlag(Qt::WindowNoState)) {
if (state == Qt::ApplicationActive) {
styleWindow(true, true);
} else {
styleWindow(false, true);
}
} else if (windowState().testFlag(Qt::WindowFullScreen)) {
if (state == Qt::ApplicationActive) {
styleWindow(true, false);
} else {
styleWindow(false, false);
}
}
}
void FramelessWindow::on_minimizeButton_clicked() {
setWindowState(Qt::WindowMinimized);
}
void FramelessWindow::on_closeButton_clicked() { close(); }
void FramelessWindow::on_windowTitlebar_doubleClicked() {
if (windowState().testFlag(Qt::WindowNoState)) {
on_maximizeButton_clicked();
} else if (windowState().testFlag(Qt::WindowFullScreen)) {
on_restoreButton_clicked();
}
}
void FramelessWindow::mouseDoubleClickEvent(QMouseEvent *event) {
Q_UNUSED(event);
}
void FramelessWindow::checkBorderDragging(QMouseEvent *event) {
if (isMaximized()) {
return;
}
QPoint globalMousePos = event->globalPos();
if (m_bMousePressed) {
QScreen *screen = QGuiApplication::primaryScreen();
// available geometry excludes taskbar
QRect availGeometry = screen->availableGeometry();
int h = availGeometry.height();
int w = availGeometry.width();
QList<QScreen *> screenlist = screen->virtualSiblings();
if (screenlist.contains(screen)) {
QSize sz = QApplication::desktop()->size();
h = sz.height();
w = sz.width();
}
// top right corner
if (m_bDragTop && m_bDragRight) {
int diff =
globalMousePos.x() - (m_StartGeometry.x() + m_StartGeometry.width());
int neww = m_StartGeometry.width() + diff;
diff = globalMousePos.y() - m_StartGeometry.y();
int newy = m_StartGeometry.y() + diff;
if (neww > 0 && newy > 0 && newy < h - 50) {
QRect newg = m_StartGeometry;
newg.setWidth(neww);
newg.setX(m_StartGeometry.x());
newg.setY(newy);
setGeometry(newg);
}
}
// top left corner
else if (m_bDragTop && m_bDragLeft) {
int diff = globalMousePos.y() - m_StartGeometry.y();
int newy = m_StartGeometry.y() + diff;
diff = globalMousePos.x() - m_StartGeometry.x();
int newx = m_StartGeometry.x() + diff;
if (newy > 0 && newx > 0) {
QRect newg = m_StartGeometry;
newg.setY(newy);
newg.setX(newx);
setGeometry(newg);
}
}
// bottom right corner
else if (m_bDragBottom && m_bDragLeft) {
int diff =
globalMousePos.y() - (m_StartGeometry.y() + m_StartGeometry.height());
int newh = m_StartGeometry.height() + diff;
diff = globalMousePos.x() - m_StartGeometry.x();
int newx = m_StartGeometry.x() + diff;
if (newh > 0 && newx > 0) {
QRect newg = m_StartGeometry;
newg.setX(newx);
newg.setHeight(newh);
setGeometry(newg);
}
} else if (m_bDragTop) {
int diff = globalMousePos.y() - m_StartGeometry.y();
int newy = m_StartGeometry.y() + diff;
if (newy > 0 && newy < h - 50) {
QRect newg = m_StartGeometry;
newg.setY(newy);
setGeometry(newg);
}
} else if (m_bDragLeft) {
int diff = globalMousePos.x() - m_StartGeometry.x();
int newx = m_StartGeometry.x() + diff;
if (newx > 0 && newx < w - 50) {
QRect newg = m_StartGeometry;
newg.setX(newx);
setGeometry(newg);
}
} else if (m_bDragRight) {
int diff =
globalMousePos.x() - (m_StartGeometry.x() + m_StartGeometry.width());
int neww = m_StartGeometry.width() + diff;
if (neww > 0) {
QRect newg = m_StartGeometry;
newg.setWidth(neww);
newg.setX(m_StartGeometry.x());
setGeometry(newg);
}
} else if (m_bDragBottom) {
int diff =
globalMousePos.y() - (m_StartGeometry.y() + m_StartGeometry.height());
int newh = m_StartGeometry.height() + diff;
if (newh > 0) {
QRect newg = m_StartGeometry;
newg.setHeight(newh);
newg.setY(m_StartGeometry.y());
setGeometry(newg);
}
}
} else {
// no mouse pressed
if (leftBorderHit(globalMousePos) && topBorderHit(globalMousePos)) {
setCursor(Qt::SizeFDiagCursor);
} else if (rightBorderHit(globalMousePos) && topBorderHit(globalMousePos)) {
setCursor(Qt::SizeBDiagCursor);
} else if (leftBorderHit(globalMousePos) &&
bottomBorderHit(globalMousePos)) {
setCursor(Qt::SizeBDiagCursor);
} else {
if (topBorderHit(globalMousePos)) {
setCursor(Qt::SizeVerCursor);
} else if (leftBorderHit(globalMousePos)) {
setCursor(Qt::SizeHorCursor);
} else if (rightBorderHit(globalMousePos)) {
setCursor(Qt::SizeHorCursor);
} else if (bottomBorderHit(globalMousePos)) {
setCursor(Qt::SizeVerCursor);
} else {
m_bDragTop = false;
m_bDragLeft = false;
m_bDragRight = false;
m_bDragBottom = false;
setCursor(Qt::ArrowCursor);
}
}
}
}
// pos in global virtual desktop coordinates
bool FramelessWindow::leftBorderHit(const QPoint &pos) {
const QRect &rect = this->geometry();
if (pos.x() >= rect.x() && pos.x() <= rect.x() + CONST_DRAG_BORDER_SIZE) {
return true;
}
return false;
}
bool FramelessWindow::rightBorderHit(const QPoint &pos) {
const QRect &rect = this->geometry();
int tmp = rect.x() + rect.width();
if (pos.x() <= tmp && pos.x() >= (tmp - CONST_DRAG_BORDER_SIZE)) {
return true;
}
return false;
}
bool FramelessWindow::topBorderHit(const QPoint &pos) {
const QRect &rect = this->geometry();
if (pos.y() >= rect.y() && pos.y() <= rect.y() + CONST_DRAG_BORDER_SIZE) {
return true;
}
return false;
}
bool FramelessWindow::bottomBorderHit(const QPoint &pos) {
const QRect &rect = this->geometry();
int tmp = rect.y() + rect.height();
if (pos.y() <= tmp && pos.y() >= (tmp - CONST_DRAG_BORDER_SIZE)) {
return true;
}
return false;
}
void FramelessWindow::mousePressEvent(QMouseEvent *event) {
if (isMaximized()) {
return;
}
m_bMousePressed = true;
m_StartGeometry = this->geometry();
QPoint globalMousePos = mapToGlobal(QPoint(event->x(), event->y()));
if (leftBorderHit(globalMousePos) && topBorderHit(globalMousePos)) {
m_bDragTop = true;
m_bDragLeft = true;
setCursor(Qt::SizeFDiagCursor);
} else if (rightBorderHit(globalMousePos) && topBorderHit(globalMousePos)) {
m_bDragRight = true;
m_bDragTop = true;
setCursor(Qt::SizeBDiagCursor);
} else if (leftBorderHit(globalMousePos) && bottomBorderHit(globalMousePos)) {
m_bDragLeft = true;
m_bDragBottom = true;
setCursor(Qt::SizeBDiagCursor);
} else {
if (topBorderHit(globalMousePos)) {
m_bDragTop = true;
setCursor(Qt::SizeVerCursor);
} else if (leftBorderHit(globalMousePos)) {
m_bDragLeft = true;
setCursor(Qt::SizeHorCursor);
} else if (rightBorderHit(globalMousePos)) {
m_bDragRight = true;
setCursor(Qt::SizeHorCursor);
} else if (bottomBorderHit(globalMousePos)) {
m_bDragBottom = true;
setCursor(Qt::SizeVerCursor);
}
}
}
void FramelessWindow::mouseReleaseEvent(QMouseEvent *event) {
Q_UNUSED(event);
if (isMaximized()) {
return;
}
m_bMousePressed = false;
bool bSwitchBackCursorNeeded =
m_bDragTop || m_bDragLeft || m_bDragRight || m_bDragBottom;
m_bDragTop = false;
m_bDragLeft = false;
m_bDragRight = false;
m_bDragBottom = false;
if (bSwitchBackCursorNeeded) {
setCursor(Qt::ArrowCursor);
}
}
bool FramelessWindow::eventFilter(QObject *obj, QEvent *event) {
if (isMaximized()) {
return QWidget::eventFilter(obj, event);
}
// check mouse move event when mouse is moved on any object
if (event->type() == QEvent::MouseMove) {
QMouseEvent *pMouse = dynamic_cast<QMouseEvent *>(event);
if (pMouse) {
checkBorderDragging(pMouse);
}
}
// press is triggered only on frame window
else if (event->type() == QEvent::MouseButtonPress && obj == this) {
QMouseEvent *pMouse = dynamic_cast<QMouseEvent *>(event);
if (pMouse) {
mousePressEvent(pMouse);
}
} else if (event->type() == QEvent::MouseButtonRelease) {
if (m_bMousePressed) {
QMouseEvent *pMouse = dynamic_cast<QMouseEvent *>(event);
if (pMouse) {
mouseReleaseEvent(pMouse);
}
}
}
return QWidget::eventFilter(obj, event);
}

69
src/darkstyle/framelesswindow/framelesswindow.h

@ -0,0 +1,69 @@
/*
###############################################################################
# #
# The MIT License #
# #
# Copyright (C) 2017 by Juergen Skrotzky ([email protected]) #
# >> https://github.com/Jorgen-VikingGod #
# #
# Sources: https://github.com/Jorgen-VikingGod/Qt-Frameless-Window-DarkStyle #
# #
###############################################################################
*/
#ifndef FRAMELESSWINDOW_H
#define FRAMELESSWINDOW_H
#include <QWidget>
namespace Ui {
class FramelessWindow;
}
class FramelessWindow : public QWidget {
Q_OBJECT
public:
explicit FramelessWindow(QWidget *parent = Q_NULLPTR);
virtual ~FramelessWindow();
void setContent(QWidget *w);
private:
bool leftBorderHit(const QPoint &pos);
bool rightBorderHit(const QPoint &pos);
bool topBorderHit(const QPoint &pos);
bool bottomBorderHit(const QPoint &pos);
void styleWindow(bool bActive, bool bNoState);
public slots:
void setWindowTitle(const QString &text);
void setWindowIcon(const QIcon &ico);
private slots:
void on_applicationStateChanged(Qt::ApplicationState state);
void on_minimizeButton_clicked();
void on_restoreButton_clicked();
void on_maximizeButton_clicked();
void on_closeButton_clicked();
void on_windowTitlebar_doubleClicked();
protected:
virtual void changeEvent(QEvent *event);
virtual void mouseDoubleClickEvent(QMouseEvent *event);
virtual void checkBorderDragging(QMouseEvent *event);
virtual void mousePressEvent(QMouseEvent *event);
virtual void mouseReleaseEvent(QMouseEvent *event);
virtual bool eventFilter(QObject *obj, QEvent *event);
private:
Ui::FramelessWindow *ui;
QRect m_StartGeometry;
const quint8 CONST_DRAG_BORDER_SIZE = 15;
bool m_bMousePressed;
bool m_bDragTop;
bool m_bDragLeft;
bool m_bDragRight;
bool m_bDragBottom;
};
#endif // FRAMELESSWINDOW_H

304
src/darkstyle/framelesswindow/framelesswindow.ui

@ -0,0 +1,304 @@
<?xml version="1.0" encoding="UTF-8"?>
<ui version="4.0">
<class>FramelessWindow</class>
<widget class="QWidget" name="FramelessWindow">
<property name="geometry">
<rect>
<x>0</x>
<y>0</y>
<width>1737</width>
<height>1157</height>
</rect>
</property>
<property name="windowTitle">
<string/>
</property>
<property name="autoFillBackground">
<bool>false</bool>
</property>
<layout class="QVBoxLayout" name="verticalLayout_2">
<property name="spacing">
<number>0</number>
</property>
<property name="leftMargin">
<number>5</number>
</property>
<property name="topMargin">
<number>5</number>
</property>
<property name="rightMargin">
<number>5</number>
</property>
<property name="bottomMargin">
<number>5</number>
</property>
<item>
<widget class="QWidget" name="windowFrame" native="true">
<property name="autoFillBackground">
<bool>false</bool>
</property>
<property name="styleSheet">
<string notr="true">#windowFrame{border:1px solid palette(highlight); border-radius:5px 5px 5px 5px; background-color:palette(Window);}</string>
</property>
<layout class="QVBoxLayout" name="verticalLayout">
<property name="spacing">
<number>0</number>
</property>
<property name="leftMargin">
<number>1</number>
</property>
<property name="topMargin">
<number>1</number>
</property>
<property name="rightMargin">
<number>1</number>
</property>
<property name="bottomMargin">
<number>1</number>
</property>
<item>
<widget class="WindowDragger" name="windowTitlebar" native="true">
<property name="sizePolicy">
<sizepolicy hsizetype="Preferred" vsizetype="Fixed">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="minimumSize">
<size>
<width>0</width>
<height>0</height>
</size>
</property>
<property name="autoFillBackground">
<bool>false</bool>
</property>
<property name="styleSheet">
<string notr="true">#windowTitlebar{border: 0px none palette(base); border-top-left-radius:5px; border-top-right-radius:5px; background-color:palette(shadow); height:20px;}</string>
</property>