@ -0,0 +1,388 @@
|
||||
## Ignore Visual Studio temporary files, build results, and
|
||||
## files generated by popular Visual Studio add-ons.
|
||||
##
|
||||
## Get latest from https://github.com/github/gitignore/blob/master/VisualStudio.gitignore
|
||||
|
||||
# User-specific files
|
||||
*.rsuser
|
||||
*.suo
|
||||
*.user
|
||||
*.userosscache
|
||||
*.sln.docstates
|
||||
|
||||
# User-specific files (MonoDevelop/Xamarin Studio)
|
||||
*.userprefs
|
||||
|
||||
# Mono auto generated files
|
||||
mono_crash.*
|
||||
|
||||
# Build results
|
||||
[Dd]ebug/
|
||||
[Dd]ebugPublic/
|
||||
[Rr]elease/
|
||||
[Rr]eleases/
|
||||
x64/
|
||||
x86/
|
||||
[Ww][Ii][Nn]32/
|
||||
[Aa][Rr][Mm]/
|
||||
[Aa][Rr][Mm]64/
|
||||
bld/
|
||||
[Bb]in/
|
||||
[Oo]bj/
|
||||
[Ll]og/
|
||||
[Ll]ogs/
|
||||
|
||||
# Visual Studio 2015/2017 cache/options directory
|
||||
.vs/
|
||||
# Uncomment if you have tasks that create the project's static files in wwwroot
|
||||
#wwwroot/
|
||||
|
||||
# Visual Studio 2017 auto generated files
|
||||
Generated\ Files/
|
||||
|
||||
# MSTest test Results
|
||||
[Tt]est[Rr]esult*/
|
||||
[Bb]uild[Ll]og.*
|
||||
|
||||
# NUnit
|
||||
*.VisualState.xml
|
||||
TestResult.xml
|
||||
nunit-*.xml
|
||||
|
||||
# Build Results of an ATL Project
|
||||
[Dd]ebugPS/
|
||||
[Rr]eleasePS/
|
||||
dlldata.c
|
||||
|
||||
# Benchmark Results
|
||||
BenchmarkDotNet.Artifacts/
|
||||
|
||||
# .NET Core
|
||||
project.lock.json
|
||||
project.fragment.lock.json
|
||||
artifacts/
|
||||
|
||||
# ASP.NET Scaffolding
|
||||
ScaffoldingReadMe.txt
|
||||
|
||||
# StyleCop
|
||||
StyleCopReport.xml
|
||||
|
||||
# Files built by Visual Studio
|
||||
*_i.c
|
||||
*_p.c
|
||||
*_h.h
|
||||
*.ilk
|
||||
*.meta
|
||||
*.obj
|
||||
*.iobj
|
||||
*.pch
|
||||
*.pdb
|
||||
*.ipdb
|
||||
*.pgc
|
||||
*.pgd
|
||||
*.rsp
|
||||
*.sbr
|
||||
*.tlb
|
||||
*.tli
|
||||
*.tlh
|
||||
*.tmp
|
||||
*.tmp_proj
|
||||
*_wpftmp.csproj
|
||||
*.log
|
||||
*.tlog
|
||||
*.vspscc
|
||||
*.vssscc
|
||||
.builds
|
||||
*.pidb
|
||||
*.svclog
|
||||
*.scc
|
||||
|
||||
# Chutzpah Test files
|
||||
_Chutzpah*
|
||||
|
||||
# Visual C++ cache files
|
||||
ipch/
|
||||
*.aps
|
||||
*.ncb
|
||||
*.opendb
|
||||
*.opensdf
|
||||
*.sdf
|
||||
*.cachefile
|
||||
*.VC.db
|
||||
*.VC.VC.opendb
|
||||
|
||||
# Visual Studio profiler
|
||||
*.psess
|
||||
*.vsp
|
||||
*.vspx
|
||||
*.sap
|
||||
|
||||
# Visual Studio Trace Files
|
||||
*.e2e
|
||||
|
||||
# TFS 2012 Local Workspace
|
||||
$tf/
|
||||
|
||||
# Guidance Automation Toolkit
|
||||
*.gpState
|
||||
|
||||
# ReSharper is a .NET coding add-in
|
||||
_ReSharper*/
|
||||
*.[Rr]e[Ss]harper
|
||||
*.DotSettings.user
|
||||
|
||||
# TeamCity is a build add-in
|
||||
_TeamCity*
|
||||
|
||||
# DotCover is a Code Coverage Tool
|
||||
*.dotCover
|
||||
|
||||
# AxoCover is a Code Coverage Tool
|
||||
.axoCover/*
|
||||
!.axoCover/settings.json
|
||||
|
||||
# Coverlet is a free, cross platform Code Coverage Tool
|
||||
coverage*.json
|
||||
coverage*.xml
|
||||
coverage*.info
|
||||
|
||||
# Visual Studio code coverage results
|
||||
*.coverage
|
||||
*.coveragexml
|
||||
|
||||
# NCrunch
|
||||
_NCrunch_*
|
||||
.*crunch*.local.xml
|
||||
nCrunchTemp_*
|
||||
|
||||
# MightyMoose
|
||||
*.mm.*
|
||||
AutoTest.Net/
|
||||
|
||||
# Web workbench (sass)
|
||||
.sass-cache/
|
||||
|
||||
# Installshield output folder
|
||||
[Ee]xpress/
|
||||
|
||||
# DocProject is a documentation generator add-in
|
||||
DocProject/buildhelp/
|
||||
DocProject/Help/*.HxT
|
||||
DocProject/Help/*.HxC
|
||||
DocProject/Help/*.hhc
|
||||
DocProject/Help/*.hhk
|
||||
DocProject/Help/*.hhp
|
||||
DocProject/Help/Html2
|
||||
DocProject/Help/html
|
||||
|
||||
# Click-Once directory
|
||||
publish/
|
||||
|
||||
# Publish Web Output
|
||||
*.[Pp]ublish.xml
|
||||
*.azurePubxml
|
||||
# Note: Comment the next line if you want to checkin your web deploy settings,
|
||||
# but database connection strings (with potential passwords) will be unencrypted
|
||||
*.pubxml
|
||||
*.publishproj
|
||||
|
||||
# Microsoft Azure Web App publish settings. Comment the next line if you want to
|
||||
# checkin your Azure Web App publish settings, but sensitive information contained
|
||||
# in these scripts will be unencrypted
|
||||
PublishScripts/
|
||||
|
||||
# NuGet Packages
|
||||
*.nupkg
|
||||
# NuGet Symbol Packages
|
||||
*.snupkg
|
||||
# The packages folder can be ignored because of Package Restore
|
||||
**/[Pp]ackages/*
|
||||
# except build/, which is used as an MSBuild target.
|
||||
!**/[Pp]ackages/build/
|
||||
# Uncomment if necessary however generally it will be regenerated when needed
|
||||
#!**/[Pp]ackages/repositories.config
|
||||
# NuGet v3's project.json files produces more ignorable files
|
||||
*.nuget.props
|
||||
*.nuget.targets
|
||||
|
||||
# Nuget personal access tokens and Credentials
|
||||
nuget.config
|
||||
|
||||
# Microsoft Azure Build Output
|
||||
csx/
|
||||
*.build.csdef
|
||||
|
||||
# Microsoft Azure Emulator
|
||||
ecf/
|
||||
rcf/
|
||||
|
||||
# Windows Store app package directories and files
|
||||
AppPackages/
|
||||
BundleArtifacts/
|
||||
Package.StoreAssociation.xml
|
||||
_pkginfo.txt
|
||||
*.appx
|
||||
*.appxbundle
|
||||
*.appxupload
|
||||
|
||||
# Visual Studio cache files
|
||||
# files ending in .cache can be ignored
|
||||
*.[Cc]ache
|
||||
# but keep track of directories ending in .cache
|
||||
!?*.[Cc]ache/
|
||||
|
||||
# Others
|
||||
ClientBin/
|
||||
~$*
|
||||
*~
|
||||
*.dbmdl
|
||||
*.dbproj.schemaview
|
||||
*.jfm
|
||||
*.pfx
|
||||
*.publishsettings
|
||||
orleans.codegen.cs
|
||||
|
||||
# Including strong name files can present a security risk
|
||||
# (https://github.com/github/gitignore/pull/2483#issue-259490424)
|
||||
#*.snk
|
||||
|
||||
# Since there are multiple workflows, uncomment next line to ignore bower_components
|
||||
# (https://github.com/github/gitignore/pull/1529#issuecomment-104372622)
|
||||
#bower_components/
|
||||
|
||||
# RIA/Silverlight projects
|
||||
Generated_Code/
|
||||
|
||||
# Backup & report files from converting an old project file
|
||||
# to a newer Visual Studio version. Backup files are not needed,
|
||||
# because we have git ;-)
|
||||
_UpgradeReport_Files/
|
||||
Backup*/
|
||||
UpgradeLog*.XML
|
||||
UpgradeLog*.htm
|
||||
ServiceFabricBackup/
|
||||
*.rptproj.bak
|
||||
|
||||
# SQL Server files
|
||||
*.mdf
|
||||
*.ldf
|
||||
*.ndf
|
||||
|
||||
# Business Intelligence projects
|
||||
*.rdl.data
|
||||
*.bim.layout
|
||||
*.bim_*.settings
|
||||
*.rptproj.rsuser
|
||||
*- [Bb]ackup.rdl
|
||||
*- [Bb]ackup ([0-9]).rdl
|
||||
*- [Bb]ackup ([0-9][0-9]).rdl
|
||||
|
||||
# Microsoft Fakes
|
||||
FakesAssemblies/
|
||||
|
||||
# GhostDoc plugin setting file
|
||||
*.GhostDoc.xml
|
||||
|
||||
# Node.js Tools for Visual Studio
|
||||
.ntvs_analysis.dat
|
||||
node_modules/
|
||||
|
||||
# Visual Studio 6 build log
|
||||
*.plg
|
||||
|
||||
# Visual Studio 6 workspace options file
|
||||
*.opt
|
||||
|
||||
# Visual Studio 6 auto-generated workspace file (contains which files were open etc.)
|
||||
*.vbw
|
||||
|
||||
# Visual Studio LightSwitch build output
|
||||
**/*.HTMLClient/GeneratedArtifacts
|
||||
**/*.DesktopClient/GeneratedArtifacts
|
||||
**/*.DesktopClient/ModelManifest.xml
|
||||
**/*.Server/GeneratedArtifacts
|
||||
**/*.Server/ModelManifest.xml
|
||||
_Pvt_Extensions
|
||||
|
||||
# Paket dependency manager
|
||||
.paket/paket.exe
|
||||
paket-files/
|
||||
|
||||
# FAKE - F# Make
|
||||
.fake/
|
||||
|
||||
# CodeRush personal settings
|
||||
.cr/personal
|
||||
|
||||
# Python Tools for Visual Studio (PTVS)
|
||||
__pycache__/
|
||||
*.pyc
|
||||
|
||||
# Cake - Uncomment if you are using it
|
||||
# tools/**
|
||||
# !tools/packages.config
|
||||
|
||||
# Tabs Studio
|
||||
*.tss
|
||||
|
||||
# Telerik's JustMock configuration file
|
||||
*.jmconfig
|
||||
|
||||
# BizTalk build output
|
||||
*.btp.cs
|
||||
*.btm.cs
|
||||
*.odx.cs
|
||||
*.xsd.cs
|
||||
|
||||
# OpenCover UI analysis results
|
||||
OpenCover/
|
||||
|
||||
# Azure Stream Analytics local run output
|
||||
ASALocalRun/
|
||||
|
||||
# MSBuild Binary and Structured Log
|
||||
*.binlog
|
||||
|
||||
# NVidia Nsight GPU debugger configuration file
|
||||
*.nvuser
|
||||
|
||||
# MFractors (Xamarin productivity tool) working folder
|
||||
.mfractor/
|
||||
|
||||
# Local History for Visual Studio
|
||||
.localhistory/
|
||||
|
||||
# BeatPulse healthcheck temp database
|
||||
healthchecksdb
|
||||
|
||||
# Backup folder for Package Reference Convert tool in Visual Studio 2017
|
||||
MigrationBackup/
|
||||
|
||||
# Ionide (cross platform F# VS Code tools) working folder
|
||||
.ionide/
|
||||
|
||||
# Fody - auto-generated XML schema
|
||||
FodyWeavers.xsd
|
||||
|
||||
# VS Code files for those working on multiple tools
|
||||
.vscode/*
|
||||
!.vscode/settings.json
|
||||
!.vscode/tasks.json
|
||||
!.vscode/launch.json
|
||||
!.vscode/extensions.json
|
||||
*.code-workspace
|
||||
|
||||
# Local History for Visual Studio Code
|
||||
.history/
|
||||
|
||||
# Windows Installer files from build outputs
|
||||
*.cab
|
||||
*.msi
|
||||
*.msix
|
||||
*.msm
|
||||
*.msp
|
||||
|
||||
# JetBrains Rider
|
||||
.idea/
|
||||
*.sln.iml
|
@ -0,0 +1,3 @@
|
||||
[submodule "dependencies/vmprofiler"]
|
||||
path = dependencies/vmprofiler
|
||||
url = https://githacks.org/vmp2/vmprofiler.git
|
@ -0,0 +1 @@
|
||||
Subproject commit a05293ab21c93c024792a8064a8344241b947f81
|
@ -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
|
@ -0,0 +1,73 @@
|
||||
/*
|
||||
###############################################################################
|
||||
# #
|
||||
# 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 #
|
||||
# #
|
||||
###############################################################################
|
||||
*/
|
||||
|
||||
#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();
|
||||
}
|
||||
}
|
@ -0,0 +1,39 @@
|
||||
/*
|
||||
###############################################################################
|
||||
# #
|
||||
# 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 #
|
||||
# #
|
||||
###############################################################################
|
||||
*/
|
||||
|
||||
#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
|
@ -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, JorgenVikingGod@gmail.com)
|
||||
>
|
||||
> 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.
|
@ -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>
|
@ -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);
|
||||
}
|
After Width: | Height: | Size: 310 B |
After Width: | Height: | Size: 358 B |
After Width: | Height: | Size: 207 B |
After Width: | Height: | Size: 313 B |
After Width: | Height: | Size: 176 B |
After Width: | Height: | Size: 373 B |
After Width: | Height: | Size: 373 B |
After Width: | Height: | Size: 121 B |
After Width: | Height: | Size: 286 B |
After Width: | Height: | Size: 286 B |
After Width: | Height: | Size: 119 B |
After Width: | Height: | Size: 238 B |
After Width: | Height: | Size: 238 B |
After Width: | Height: | Size: 422 B |
After Width: | Height: | Size: 370 B |
After Width: | Height: | Size: 617 B |
After Width: | Height: | Size: 616 B |
After Width: | Height: | Size: 310 B |
After Width: | Height: | Size: 538 B |
After Width: | Height: | Size: 537 B |
After Width: | Height: | Size: 404 B |
After Width: | Height: | Size: 424 B |
After Width: | Height: | Size: 303 B |
@ -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
|
@ -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>
|
@ -0,0 +1,458 @@
|
||||
/*
|
||||
###############################################################################
|
||||
# #
|
||||
# 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 #
|
||||
# #
|
||||
###############################################################################
|
||||
*/
|
||||
|
||||
#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);
|
||||
}
|
@ -0,0 +1,69 @@
|
||||
/*
|
||||
###############################################################################
|
||||
# #
|
||||
# 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 #
|
||||
# #
|
||||
###############################################################################
|
||||
*/
|
||||
|
||||
#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
|
@ -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>1479</width>
|
||||
<height>1099</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>
|
||||
<layout class="QHBoxLayout" name="horizontalLayout" stretch="0,0,0,0,0,0,0">
|
||||
<property name="spacing">
|
||||
<number>0</number>
|
||||
</property>
|
||||
<property name="leftMargin">
|
||||
<number>0</number>
|
||||
</property>
|
||||
<property name="topMargin">
|
||||
<number>0</number>
|
||||
</property>
|
||||
<property name="rightMargin">
|
||||
<number>0</number>
|
||||
</property>
|
||||
<property name="bottomMargin">
|
||||
<number>0</number>
|
||||
</property>
|
||||
<item>
|
||||
<widget class="QLabel" name="spacer">
|
||||
<property name="minimumSize">
|
||||
<size>
|
||||
<width>4</width>
|
||||
<height>0</height>
|
||||
</size>
|
||||
</property>
|
||||
<property name="maximumSize">
|
||||
<size>
|
||||
<width>4</width>
|
||||
<height>16777215</height>
|
||||
</size>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item>
|
||||
<widget class="QLabel" name="icon">
|
||||
<property name="minimumSize">
|
||||
<size>
|
||||
<width>16</width>
|
||||
<height>16</height>
|
||||
</size>
|
||||
</property>
|
||||
<property name="maximumSize">
|
||||
<size>
|
||||
<width>16</width>
|
||||
<height>16</height>
|
||||
</size>
|
||||
</property>
|
||||
<property name="contextMenuPolicy">
|
||||
<enum>Qt::NoContextMenu</enum>
|
||||
</property>
|
||||
<property name="styleSheet">
|
||||
<string notr="true">#icon {background-color:palette(shadow);}</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item>
|
||||
<widget class="QLabel" name="titleText">
|
||||
<property name="font">
|
||||
<font>
|
||||
<weight>75</weight>
|
||||
<bold>true</bold>
|
||||
</font>
|
||||
</property>
|
||||
<property name="styleSheet">
|
||||
<string notr="true"> padding-left:5px;
|
||||
color:rgb(153,153,153);</string>
|
||||
</property>
|
||||
<property name="text">
|
||||
<string>VMProtect 2 - Virtual Instruction Trace Inspector</string>
|
||||
</property>
|
||||
<property name="alignment">
|
||||
<set>Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter</set>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item>
|
||||
<widget class="QToolButton" name="minimizeButton">
|
||||
<property name="font">
|
||||
<font>
|
||||
<weight>75</weight>
|
||||
<bold>true</bold>
|
||||
</font>
|
||||
</property>
|
||||
<property name="styleSheet">
|
||||
<string notr="true">#minimizeButton{
|
||||
background-color:none;
|
||||
border:none;
|
||||
width:16px;
|
||||
height:16px;
|
||||
padding:4px;
|
||||
image:url(:/images/icon_window_minimize.png);
|
||||
}
|
||||
#minimizeButton:hover{
|
||||
background-color:palette(alternate-base);
|
||||
}
|
||||
#minimizeButton:pressed{
|
||||
background-color:palette(highlight);
|
||||
}</string>
|
||||
</property>
|
||||
<property name="text">
|
||||
<string/>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item>
|
||||
<widget class="QToolButton" name="restoreButton">
|
||||
<property name="styleSheet">
|
||||
<string notr="true">#restoreButton{
|
||||
background-color:none;
|
||||
border:none;
|
||||
width:16px;
|
||||
height:16px;
|
||||
padding:4px;
|
||||
image:url(:/images/icon_window_restore.png);
|
||||
}
|
||||
#restoreButton:hover{
|
||||
background-color:palette(alternate-base);
|
||||
}
|
||||
#restoreButton:pressed{
|
||||
background-color:palette(highlight);
|
||||
}</string>
|
||||
</property>
|
||||
<property name="text">
|
||||
<string/>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item>
|
||||
<widget class="QToolButton" name="maximizeButton">
|
||||
<property name="styleSheet">
|
||||
<string notr="true">#maximizeButton{
|
||||
background-color:none;
|
||||
border:none;
|
||||
width:16px;
|
||||
height:16px;
|
||||
padding:4px;
|
||||
image:url(:/images/icon_window_maximize.png);
|
||||
}
|
||||
#maximizeButton:hover{
|
||||
background-color:palette(alternate-base);
|
||||
}
|
||||
##maximizeButton:pressed{
|
||||
background-color:palette(highlight);
|
||||
}</string>
|
||||
</property>
|
||||
<property name="text">
|
||||
<string/>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item>
|
||||
<widget class="QToolButton" name="closeButton">
|
||||
<property name="font">
|
||||
<font>
|
||||
<weight>75</weight>
|
||||
<bold>true</bold>
|
||||
</font>
|
||||
</property>
|
||||
<property name="styleSheet">
|
||||
<string notr="true">#closeButton{
|
||||
background-color:none;
|
||||
border:none;
|
||||
width:16px;
|
||||
height:16px;
|
||||
padding:4px;
|
||||
image:url(:/images/icon_window_close.png);
|
||||
border-top-right-radius: 5px;
|
||||
}
|
||||
#closeButton:hover{
|
||||
background-color:palette(alternate-base);
|
||||
}
|
||||
##closeButton:pressed{
|
||||
background-color:palette(highlight);
|
||||
}</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
</layout>
|
||||
</widget>
|
||||
</item>
|
||||
<item>
|
||||
<widget class="QWidget" name="windowContent" native="true">
|
||||
<property name="autoFillBackground">
|
||||
<bool>false</bool>
|
||||
</property>
|
||||
<property name="styleSheet">
|
||||
<string notr="true">#windowContent{
|
||||
border: 0px none palette(base);
|
||||
border-radius:0px 0px 5px 5px;
|
||||
}</string>
|
||||
</property>
|
||||
<layout class="QVBoxLayout" name="verticalLayout_3">
|
||||
<property name="spacing">
|
||||
<number>0</number>
|
||||
</property>
|
||||
<property name="leftMargin">
|
||||
<number>0</number>
|
||||
</property>
|
||||
<property name="topMargin">
|
||||
<number>0</number>
|
||||
</property>
|
||||
<property name="rightMargin">
|
||||
<number>0</number>
|
||||
</property>
|
||||
<property name="bottomMargin">
|
||||
<number>0</number>
|
||||
</property>
|
||||
</layout>
|
||||
</widget>
|
||||
</item>
|
||||
</layout>
|
||||
</widget>
|
||||
</item>
|
||||
</layout>
|
||||
</widget>
|
||||
<layoutdefault spacing="6" margin="11"/>
|
||||
<customwidgets>
|
||||
<customwidget>
|
||||
<class>WindowDragger</class>
|
||||
<extends>QWidget</extends>
|
||||
<header>windowdragger.h</header>
|
||||
<container>1</container>
|
||||
</customwidget>
|
||||
</customwidgets>
|
||||
<resources/>
|
||||
<connections/>
|
||||
</ui>
|
@ -0,0 +1,56 @@
|
||||
/*
|
||||
###############################################################################
|
||||
# #
|
||||
# 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 #
|
||||
# #
|
||||
###############################################################################
|
||||
*/
|
||||
|
||||
#include "windowdragger.h"
|
||||
#include <QPainter>
|
||||
#include <QStyleOption>
|
||||
|
||||
WindowDragger::WindowDragger(QWidget *parent) : QWidget(parent) {
|
||||
mousePressed = false;
|
||||
}
|
||||
|
||||
void WindowDragger::mousePressEvent(QMouseEvent *event) {
|
||||
mousePressed = true;
|
||||
mousePos = event->globalPos();
|
||||
|
||||
QWidget *parent = parentWidget();
|
||||
if (parent) parent = parent->parentWidget();
|
||||
|
||||
if (parent) wndPos = parent->pos();
|
||||
}
|
||||
|
||||
void WindowDragger::mouseMoveEvent(QMouseEvent *event) {
|
||||
QWidget *parent = parentWidget();
|
||||
if (parent) parent = parent->parentWidget();
|
||||
|
||||
if (parent && mousePressed)
|
||||
parent->move(wndPos + (event->globalPos() - mousePos));
|
||||
}
|
||||
|
||||
void WindowDragger::mouseReleaseEvent(QMouseEvent *event) {
|
||||
Q_UNUSED(event);
|
||||
mousePressed = false;
|
||||
}
|
||||
|
||||
void WindowDragger::paintEvent(QPaintEvent *event) {
|
||||
Q_UNUSED(event);
|
||||
QStyleOption styleOption;
|
||||
styleOption.init(this);
|
||||
QPainter painter(this);
|
||||
style()->drawPrimitive(QStyle::PE_Widget, &styleOption, &painter, this);
|
||||
}
|
||||
|
||||
void WindowDragger::mouseDoubleClickEvent(QMouseEvent *event) {
|
||||
Q_UNUSED(event);
|
||||
emit doubleClicked();
|
||||
}
|
@ -0,0 +1,43 @@
|
||||
/*
|
||||
###############################################################################
|
||||
# #
|
||||
# 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 #
|
||||
# #
|
||||
###############################################################################
|
||||
*/
|
||||
|
||||
#ifndef WINDOWDRAGGER_H
|
||||
#define WINDOWDRAGGER_H
|
||||
|
||||
#include <QMouseEvent>
|
||||
#include <QWidget>
|
||||
|
||||
class WindowDragger : public QWidget {
|
||||
Q_OBJECT
|
||||
|
||||
public:
|
||||
explicit WindowDragger(QWidget *parent = Q_NULLPTR);
|
||||
virtual ~WindowDragger() {}
|
||||
|
||||
signals:
|
||||
void doubleClicked();
|
||||
|
||||
protected:
|
||||
void mousePressEvent(QMouseEvent *event);
|
||||
void mouseMoveEvent(QMouseEvent *event);
|
||||
void mouseReleaseEvent(QMouseEvent *event);
|
||||
void mouseDoubleClickEvent(QMouseEvent *event);
|
||||
void paintEvent(QPaintEvent *event);
|
||||
|
||||
protected:
|
||||
QPoint mousePos;
|
||||
QPoint wndPos;
|
||||
bool mousePressed;
|
||||
};
|
||||
|
||||
#endif // WINDOWDRAGGER_H
|
After Width: | Height: | Size: 422 B |
After Width: | Height: | Size: 386 B |
After Width: | Height: | Size: 364 B |
After Width: | Height: | Size: 404 B |
@ -0,0 +1,40 @@
|
||||
/*
|
||||
###############################################################################
|
||||
# #
|
||||
# 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 #
|
||||
# #
|
||||
###############################################################################
|
||||
*/
|
||||
|
||||
#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::WindowFullScreen);
|
||||
//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();
|
||||
}
|
@ -0,0 +1,23 @@
|
||||
/*
|
||||
###############################################################################
|
||||
# #
|
||||
# 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 #
|
||||
# #
|
||||
###############################################################################
|
||||
*/
|
||||
|
||||
#include "mainwindow.h"
|
||||
#include "ui_mainwindow.h"
|
||||
|
||||
MainWindow::MainWindow(QWidget *parent)
|
||||
: QMainWindow(parent /*, Qt::FramelessWindowHint*/),
|
||||
ui(new Ui::MainWindow) {
|
||||
ui->setupUi(this);
|
||||
}
|
||||
|
||||
MainWindow::~MainWindow() { delete ui; }
|
@ -0,0 +1,34 @@
|
||||
/*
|
||||
###############################################################################
|
||||
# #
|
||||
# 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 #
|
||||
# #
|
||||
###############################################################################
|
||||
*/
|
||||
|
||||
#ifndef MAINWINDOW_H
|
||||
#define MAINWINDOW_H
|
||||
|
||||
#include <QtWidgets>
|
||||
|
||||
namespace Ui {
|
||||
class MainWindow;
|
||||
}
|
||||
|
||||
class MainWindow : public QMainWindow {
|
||||
Q_OBJECT
|
||||
|
||||
public:
|
||||
explicit MainWindow(QWidget *parent = Q_NULLPTR);
|
||||
~MainWindow();
|
||||
|
||||
private:
|
||||
Ui::MainWindow *ui;
|
||||
};
|
||||
|
||||
#endif // MAINWINDOW_H
|
@ -0,0 +1,645 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<ui version="4.0">
|
||||
<class>MainWindow</class>
|
||||
<widget class="QMainWindow" name="MainWindow">
|
||||
<property name="geometry">
|
||||
<rect>
|
||||
<x>0</x>
|
||||
<y>0</y>
|
||||
<width>670</width>
|
||||
<height>559</height>
|
||||
</rect>
|
||||
</property>
|
||||
<property name="windowTitle">
|
||||
<string>MainWindow</string>
|
||||
</property>
|
||||
<widget class="QWidget" name="centralWidget">
|
||||
<layout class="QGridLayout" name="gridLayout_2">
|
||||
<item row="0" column="0" colspan="2">
|
||||
<layout class="QHBoxLayout" name="horizontalLayout">
|
||||
<item>
|
||||
<widget class="QLabel" name="label">
|
||||
<property name="text">
|
||||
<string>Label</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item>
|
||||
<widget class="QComboBox" name="comboBox">
|
||||
<item>
|
||||
<property name="text">
|
||||
<string>New Item</string>
|
||||
</property>
|
||||
</item>
|
||||
<item>
|
||||
<property name="text">
|
||||
<string>New Item 2</string>
|
||||
</property>
|
||||
</item>
|
||||
<item>
|
||||
<property name="text">
|
||||
<string>New Item 3</string>
|
||||
</property>
|
||||
</item>
|
||||
</widget>
|
||||
</item>
|
||||
<item>
|
||||
<spacer name="horizontalSpacer">
|
||||
<property name="orientation">
|
||||
<enum>Qt::Horizontal</enum>
|
||||
</property>
|
||||
<property name="sizeHint" stdset="0">
|
||||
<size>
|
||||
<width>40</width>
|
||||
<height>20</height>
|
||||
</size>
|
||||
</property>
|
||||
</spacer>
|
||||
</item>
|
||||
<item>
|
||||
<widget class="QCheckBox" name="checkBox_4">
|
||||
<property name="text">
|
||||
<string>Disable Widgets</string>
|
||||
</property>
|
||||
<property name="checked">
|
||||
<bool>false</bool>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
</layout>
|
||||
</item>
|
||||
<item row="1" column="0">
|
||||
<widget class="QGroupBox" name="groupBox">
|
||||
<property name="title">
|
||||
<string>GroupBox</string>
|
||||
</property>
|
||||
<layout class="QVBoxLayout" name="verticalLayout_4">
|
||||
<item>
|
||||
<widget class="QRadioButton" name="radioButton">
|
||||
<property name="toolTipDuration">
|
||||
<number>-10</number>
|
||||
</property>
|
||||
<property name="text">
|
||||
<string>RadioButton</string>
|
||||
</property>
|
||||
<property name="checked">
|
||||
<bool>true</bool>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item>
|
||||
<widget class="QRadioButton" name="radioButton_2">
|
||||
<property name="text">
|
||||
<string>RadioButton</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item>
|
||||
<widget class="QRadioButton" name="radioButton_3">
|
||||
<property name="text">
|
||||
<string>RadioButton</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item>
|
||||
<widget class="QCheckBox" name="checkBox">
|
||||
<property name="text">
|
||||
<string>CheckBox</string>
|
||||
</property>
|
||||
<property name="checkable">
|
||||
<bool>true</bool>
|
||||
</property>
|
||||
<property name="checked">
|
||||
<bool>false</bool>
|
||||
</property>
|
||||
<property name="autoExclusive">
|
||||
<bool>false</bool>
|
||||
</property>
|
||||
<property name="tristate">
|
||||
<bool>true</bool>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
</layout>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="1" column="1">
|
||||
<widget class="QGroupBox" name="groupBox_2">
|
||||
<property name="title">
|
||||
<string>GroupBox</string>
|
||||
</property>
|
||||
<layout class="QVBoxLayout" name="verticalLayout_3">
|
||||
<item>
|
||||
<widget class="QPushButton" name="pushButton">
|
||||
<property name="text">
|
||||
<string>PushButton</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item>
|
||||
<widget class="QPushButton" name="pushButton_2">
|
||||
<property name="text">
|
||||
<string>PushButton</string>
|
||||
</property>
|
||||
<property name="checkable">
|
||||
<bool>true</bool>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item>
|
||||
<widget class="QPushButton" name="pushButton_3">
|
||||
<property name="text">
|
||||
<string>PushButton</string>
|
||||
</property>
|
||||
<property name="flat">
|
||||
<bool>true</bool>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item>
|
||||
<widget class="QPushButton" name="pushButton_4">
|
||||
<property name="text">
|
||||
<string>PushButton</string>
|
||||
</property>
|
||||
<property name="default">
|
||||
<bool>true</bool>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
</layout>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="2" column="0">
|
||||
<widget class="QTabWidget" name="tabWidget">
|
||||
<property name="currentIndex">
|
||||
<number>1</number>
|
||||
</property>
|
||||
<widget class="QWidget" name="tab">
|
||||
<attribute name="title">
|
||||
<string>TextEdit</string>
|
||||
</attribute>
|
||||
<layout class="QVBoxLayout" name="verticalLayout">
|
||||
<item>
|
||||
<widget class="QTextEdit" name="textEdit">
|
||||
<property name="html">
|
||||
<string><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
|
||||
<html><head><meta name="qrichtext" content="1" /><style type="text/css">
|
||||
p, li { white-space: pre-wrap; }
|
||||
</style></head><body style=" font-family:'MS Shell Dlg 2'; font-size:8.25pt; font-weight:400; font-style:normal;">
|
||||
<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'.SF NS Text'; font-size:13pt;">test<br />test<br />test<br />test<br />test<br />test<br />test<br />test<br />test<br />test<br />test<br />test<br />test<br />test<br />test<br />test<br />test<br />test<br />test<br />test<br />test<br />test<br />test<br />test<br />test<br />test<br />test<br />test<br />test<br />test<br />test<br />test<br />test<br />test<br />test<br />test<br />test<br />test<br />test<br />test<br />test<br />test<br />test<br />test<br />test<br />test<br />test<br />test<br />test<br />test<br />test<br />test<br />test<br />test<br />test<br />test<br />test<br />test<br />test<br />test<br />test<br />test<br />test<br />test<br />test<br />test<br /></span></p></body></html></string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
</layout>
|
||||
</widget>
|
||||
<widget class="QWidget" name="tab_2">
|
||||
<attribute name="title">
|
||||
<string>Tab Table</string>
|
||||
</attribute>
|
||||
<layout class="QVBoxLayout" name="verticalLayout_2">
|
||||
<item>
|
||||
<widget class="QTableWidget" name="tableWidget">
|
||||
<row>
|
||||
<property name="text">
|
||||
<string>1</string>
|
||||
</property>
|
||||
</row>
|
||||
<row>
|
||||
<property name="text">
|
||||
<string>2</string>
|
||||
</property>
|
||||
</row>
|
||||
<row>
|
||||
<property name="text">
|
||||
<string>3</string>
|
||||
</property>
|
||||
</row>
|
||||
<row>
|
||||
<property name="text">
|
||||
<string>4</string>
|
||||
</property>
|
||||
</row>
|
||||
<row>
|
||||
<property name="text">
|
||||
<string>5</string>
|
||||
</property>
|
||||
</row>
|
||||
<row>
|
||||
<property name="text">
|
||||
<string>6</string>
|
||||
</property>
|
||||
</row>
|
||||
<row>
|
||||
<property name="text">
|
||||
<string>7</string>
|
||||
</property>
|
||||
</row>
|
||||
<row>
|
||||
<property name="text">
|
||||
<string>8</string>
|
||||
</property>
|
||||
</row>
|
||||
<row>
|
||||
<property name="text">
|
||||
<string>9</string>
|
||||
</property>
|
||||
</row>
|
||||
<row>
|
||||
<property name="text">
|
||||
<string>10</string>
|
||||
</property>
|
||||
</row>
|
||||
<column>
|
||||
<property name="text">
|
||||
<string>1</string>
|
||||
</property>
|
||||
</column>
|
||||
<column>
|
||||
<property name="text">
|
||||
<string>2</string>
|
||||
</property>
|
||||
</column>
|
||||
<column>
|
||||
<property name="text">
|
||||
<string>3</string>
|
||||
</property>
|
||||
</column>
|
||||
<column>
|
||||
<property name="text">
|
||||
<string>4</string>
|
||||
</property>
|
||||
</column>
|
||||
<column>
|
||||
<property name="text">
|
||||
<string>5</string>
|
||||
</property>
|
||||
</column>
|
||||
<column>
|
||||
<property name="text">
|
||||
<string>6</string>
|
||||
</property>
|
||||
</column>
|
||||
<column>
|
||||
<property name="text">
|
||||
<string>7</string>
|
||||
</property>
|
||||
</column>
|
||||
<column>
|
||||
<property name="text">
|
||||
<string>8</string>
|
||||
</property>
|
||||
</column>
|
||||
<column>
|
||||
<property name="text">
|
||||
<string>9</string>
|
||||
</property>
|
||||
</column>
|
||||
<column>
|
||||
<property name="text">
|
||||
<string>10</string>
|
||||
</property>
|
||||
</column>
|
||||
<item row="0" column="0">
|
||||
<property name="text">
|
||||
<string>Cell 1/1</string>
|
||||
</property>
|
||||
</item>
|
||||
<item row="0" column="1">
|
||||
<property name="text">
|
||||
<string>Cell 2/1</string>
|
||||
</property>
|
||||
</item>
|
||||
<item row="1" column="0">
|
||||
<property name="text">
|
||||
<string>Cell 1/2</string>
|
||||
</property>
|
||||
</item>
|
||||
</widget>
|
||||
</item>
|
||||
</layout>
|
||||
</widget>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="2" column="1">
|
||||
<widget class="QGroupBox" name="groupBox_3">
|
||||
<property name="title">
|
||||
<string>GroupBox</string>
|
||||
</property>
|
||||
<property name="checkable">
|
||||
<bool>true</bool>
|
||||
</property>
|
||||
<layout class="QGridLayout" name="gridLayout">
|
||||
<item row="3" column="1" rowspan="2">
|
||||
<widget class="QDial" name="dial">
|
||||
<property name="value">
|
||||
<number>30</number>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="2" column="0" colspan="2">
|
||||
<widget class="QDateTimeEdit" name="dateTimeEdit"/>
|
||||
</item>
|
||||
<item row="3" column="0">
|
||||
<widget class="QSlider" name="horizontalSlider">
|
||||
<property name="value">
|
||||
<number>60</number>
|
||||
</property>
|
||||
<property name="orientation">
|
||||
<enum>Qt::Horizontal</enum>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="1" column="0" colspan="2">
|
||||
<widget class="QSpinBox" name="spinBox"/>
|
||||
</item>
|
||||
<item row="4" column="0">
|
||||
<widget class="QScrollBar" name="horizontalScrollBar">
|
||||
<property name="value">
|
||||
<number>25</number>
|
||||
</property>
|
||||
<property name="orientation">
|
||||
<enum>Qt::Horizontal</enum>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="0" column="0" colspan="2">
|
||||
<widget class="QLineEdit" name="lineEdit">
|
||||
<property name="text">
|
||||
<string>test</string>
|
||||
</property>
|
||||
<property name="echoMode">
|
||||
<enum>QLineEdit::Password</enum>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="5" column="0" colspan="2">
|
||||
<spacer name="verticalSpacer">
|
||||
<property name="orientation">
|
||||
<enum>Qt::Vertical</enum>
|
||||
</property>
|
||||
<property name="sizeHint" stdset="0">
|
||||
<size>
|
||||
<width>20</width>
|
||||
<height>40</height>
|
||||
</size>
|
||||
</property>
|
||||
</spacer>
|
||||
</item>
|
||||
</layout>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="3" column="0" colspan="2">
|
||||
<widget class="QProgressBar" name="progressBar">
|
||||
<property name="value">
|
||||
<number>24</number>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
</layout>
|
||||
</widget>
|
||||
<widget class="QMenuBar" name="menuBar">
|
||||
<property name="geometry">
|
||||
<rect>
|
||||
<x>0</x>
|
||||
<y>0</y>
|
||||
<width>670</width>
|
||||
<height>20</height>
|
||||
</rect>
|
||||
</property>
|
||||
<widget class="QMenu" name="menuTest">
|
||||
<property name="title">
|
||||
<string>Test</string>
|
||||
</property>
|
||||
<addaction name="actionTest"/>
|
||||
<addaction name="actionTest_2"/>
|
||||
<addaction name="separator"/>
|
||||
<addaction name="actionTest_3"/>
|
||||
</widget>
|
||||
<widget class="QMenu" name="menuTest2">
|
||||
<property name="title">
|
||||
<string>Test2</string>
|
||||
</property>
|
||||
<widget class="QMenu" name="menuTest2_2">
|
||||
<property name="title">
|
||||
<string>Test2</string>
|
||||
</property>
|
||||
<addaction name="actionTest3"/>
|
||||
<addaction name="actionTest3_2"/>
|
||||
</widget>
|
||||
<addaction name="menuTest2_2"/>
|
||||
</widget>
|
||||
<addaction name="menuTest"/>
|
||||
<addaction name="menuTest2"/>
|
||||
</widget>
|
||||
<widget class="QToolBar" name="mainToolBar">
|
||||
<attribute name="toolBarArea">
|
||||
<enum>TopToolBarArea</enum>
|
||||
</attribute>
|
||||
<attribute name="toolBarBreak">
|
||||
<bool>false</bool>
|
||||
</attribute>
|
||||
<addaction name="actionTest"/>
|
||||
<addaction name="actionTest_2"/>
|
||||
<addaction name="actionTest3"/>
|
||||
</widget>
|
||||
<widget class="QStatusBar" name="statusBar"/>
|
||||
<action name="actionTest">
|
||||
<property name="text">
|
||||
<string>Test</string>
|
||||
</property>
|
||||
</action>
|
||||
<action name="actionTest_2">
|
||||
<property name="checkable">
|
||||
<bool>true</bool>
|
||||
</property>
|
||||
<property name="checked">
|
||||
<bool>true</bool>
|
||||
</property>
|
||||
<property name="text">
|
||||
<string>Test</string>
|
||||
</property>
|
||||
</action>
|
||||
<action name="actionTest_3">
|
||||
<property name="checkable">
|
||||
<bool>true</bool>
|
||||
</property>
|
||||
<property name="text">
|
||||
<string>Test</string>
|
||||
</property>
|
||||
</action>
|
||||
<action name="actionTest3">
|
||||
<property name="text">
|
||||
<string>Test3</string>
|
||||
</property>
|
||||
</action>
|
||||
<action name="actionTest3_2">
|
||||
<property name="text">
|
||||
<string>Test3</string>
|
||||
</property>
|
||||
</action>
|
||||
</widget>
|
||||
<layoutdefault spacing="6" margin="11"/>
|
||||
<resources/>
|
||||
<connections>
|
||||
<connection>
|
||||
<sender>checkBox_4</sender>
|
||||
<signal>toggled(bool)</signal>
|
||||
<receiver>groupBox_2</receiver>
|
||||
<slot>setDisabled(bool)</slot>
|
||||
<hints>
|
||||
<hint type="sourcelabel">
|
||||
<x>543</x>
|
||||
<y>70</y>
|
||||
</hint>
|
||||
<hint type="destinationlabel">
|
||||
<x>376</x>
|
||||
<y>97</y>
|
||||
</hint>
|
||||
</hints>
|
||||
</connection>
|
||||
<connection>
|
||||
<sender>checkBox_4</sender>
|
||||
<signal>toggled(bool)</signal>
|
||||
<receiver>groupBox</receiver>
|
||||
<slot>setDisabled(bool)</slot>
|
||||
<hints>
|
||||
<hint type="sourcelabel">
|
||||
<x>617</x>
|
||||
<y>70</y>
|
||||
</hint>
|
||||
<hint type="destinationlabel">
|
||||
<x>47</x>
|
||||
<y>104</y>
|
||||
</hint>
|
||||
</hints>
|
||||
</connection>
|
||||
<connection>
|
||||
<sender>checkBox_4</sender>
|
||||
<signal>toggled(bool)</signal>
|
||||
<receiver>tabWidget</receiver>
|
||||
<slot>setDisabled(bool)</slot>
|
||||
<hints>
|
||||
<hint type="sourcelabel">
|
||||
<x>623</x>
|
||||
<y>74</y>
|
||||
</hint>
|
||||
<hint type="destinationlabel">
|
||||
<x>234</x>
|
||||
<y>264</y>
|
||||
</hint>
|
||||
</hints>
|
||||
</connection>
|
||||
<connection>
|
||||
<sender>checkBox_4</sender>
|
||||
<signal>toggled(bool)</signal>
|
||||
<receiver>groupBox_3</receiver>
|
||||
<slot>setDisabled(bool)</slot>
|
||||
<hints>
|
||||
<hint type="sourcelabel">
|
||||
<x>503</x>
|
||||
<y>80</y>
|
||||
</hint>
|
||||
<hint type="destinationlabel">
|
||||
<x>503</x>
|
||||
<y>262</y>
|
||||
</hint>
|
||||
</hints>
|
||||
</connection>
|
||||
<connection>
|
||||
<sender>checkBox_4</sender>
|
||||
<signal>toggled(bool)</signal>
|
||||
<receiver>progressBar</receiver>
|
||||
<slot>setDisabled(bool)</slot>
|
||||
<hints>
|
||||
<hint type="sourcelabel">
|
||||
<x>631</x>
|
||||
<y>73</y>
|
||||
</hint>
|
||||
<hint type="destinationlabel">
|
||||
<x>607</x>
|
||||
<y>517</y>
|
||||
</hint>
|
||||
</hints>
|
||||
</connection>
|
||||
<connection>
|
||||
<sender>checkBox_4</sender>
|
||||
<signal>toggled(bool)</signal>
|
||||
<receiver>mainToolBar</receiver>
|
||||
<slot>setDisabled(bool)</slot>
|
||||
<hints>
|
||||
<hint type="sourcelabel">
|
||||
<x>648</x>
|
||||
<y>71</y>
|
||||
</hint>
|
||||
<hint type="destinationlabel">
|
||||
<x>105</x>
|
||||
<y>33</y>
|
||||
</hint>
|
||||
</hints>
|
||||
</connection>
|
||||
<connection>
|
||||
<sender>checkBox_4</sender>
|
||||
<signal>toggled(bool)</signal>
|
||||
<receiver>menuBar</receiver>
|
||||
<slot>setDisabled(bool)</slot>
|
||||
<hints>
|
||||
<hint type="sourcelabel">
|
||||
<x>634</x>
|
||||
<y>73</y>
|
||||
</hint>
|
||||
<hint type="destinationlabel">
|
||||
<x>64</x>
|
||||
<y>7</y>
|
||||
</hint>
|
||||
</hints>
|
||||
</connection>
|
||||
<connection>
|
||||
<sender>checkBox_4</sender>
|
||||
<signal>toggled(bool)</signal>
|
||||
<receiver>statusBar</receiver>
|
||||
<slot>setDisabled(bool)</slot>
|
||||
<hints>
|
||||
<hint type="sourcelabel">
|
||||
<x>650</x>
|
||||
<y>70</y>
|
||||
</hint>
|
||||
<hint type="destinationlabel">
|
||||
<x>533</x>
|
||||
<y>549</y>
|
||||
</hint>
|
||||
</hints>
|
||||
</connection>
|
||||
<connection>
|
||||
<sender>checkBox_4</sender>
|
||||
<signal>toggled(bool)</signal>
|
||||
<receiver>comboBox</receiver>
|
||||
<slot>setDisabled(bool)</slot>
|
||||
<hints>
|
||||
<hint type="sourcelabel">
|
||||
<x>626</x>
|
||||
<y>70</y>
|
||||
</hint>
|
||||
<hint type="destinationlabel">
|
||||
<x>297</x>
|
||||
<y>65</y>
|
||||
</hint>
|
||||
</hints>
|
||||
</connection>
|
||||
<connection>
|
||||
<sender>checkBox_4</sender>
|
||||
<signal>toggled(bool)</signal>
|
||||
<receiver>label</receiver>
|
||||
<slot>setDisabled(bool)</slot>
|
||||
<hints>
|
||||
<hint type="sourcelabel">
|
||||
<x>639</x>
|
||||
<y>78</y>
|
||||
</hint>
|
||||
<hint type="destinationlabel">
|
||||
<x>28</x>
|
||||
<y>66</y>
|
||||
</hint>
|
||||
</hints>
|
||||
</connection>
|
||||
</connections>
|
||||
</ui>
|
After Width: | Height: | Size: 116 KiB |
After Width: | Height: | Size: 128 KiB |
After Width: | Height: | Size: 22 KiB |
@ -0,0 +1,358 @@
|
||||
#include "QVMProfiler.h"
|
||||
|
||||
QVMProfiler::QVMProfiler(QWidget *parent)
|
||||
: QMainWindow(parent),
|
||||
TraceFileBlob(nullptr),
|
||||
VMCtx(nullptr)
|
||||
{
|
||||
ui.setupUi(this);
|
||||
}
|
||||
|
||||
void QVMProfiler::on_actionCloseProgram_triggered()
|
||||
{ exit(0); }
|
||||
|
||||
void QVMProfiler::on_actionOpen_VMTrace_triggered()
|
||||
{
|
||||
if (TraceFileBlob && VMCtx)
|
||||
{
|
||||
free(TraceFileBlob);
|
||||
TraceFileBlob = nullptr;
|
||||
TraceFileHeader = nullptr;
|
||||
TraceEntryList = nullptr;
|
||||
VMHandlerTable = nullptr;
|
||||
|
||||
ImageBase = NULL;
|
||||
VMEntryRva = NULL;
|
||||
ModuleBase = NULL;
|
||||
|
||||
VMHandlers.clear();
|
||||
VMEntry.clear();
|
||||
delete VMCtx;
|
||||
}
|
||||
|
||||
TraceFilePath = QFileDialog::getOpenFileName(this,
|
||||
tr("Open Trace"), "C:\\", tr("VMTrace Files (*.vmp2)"));
|
||||
|
||||
if (TraceFilePath.isEmpty())
|
||||
{
|
||||
DbgMessage("Invalid Trace File... No File Selected...");
|
||||
return;
|
||||
}
|
||||
|
||||
if (!std::filesystem::exists(TraceFilePath.toStdString().c_str()))
|
||||
{
|
||||
DbgMessage("Trace File Doesnt Exist...");
|
||||
return;
|
||||
}
|
||||
|
||||
VMProtectedFilePath = QFileDialog::getOpenFileName(this,
|
||||
tr("Open VMProtected File"), "C:\\");
|
||||
|
||||
if (VMProtectedFilePath.isEmpty())
|
||||
{
|
||||
DbgMessage("Invalid VMProtected File... No File Selected...");
|
||||
return;
|
||||
}
|
||||
|
||||
if (!std::filesystem::exists(VMProtectedFilePath.toStdString().c_str()))
|
||||
{
|
||||
DbgMessage("VMProtected File Doesnt Exist...");
|
||||
return;
|
||||
}
|
||||
|
||||
bool Success = false;
|
||||
auto VMEntryRvaStr = QInputDialog::getText(0, "Input",
|
||||
"VMEntry Relative Virtual Address:", QLineEdit::Normal, "", &Success);
|
||||
|
||||
if (!Success || VMEntryRvaStr.isEmpty())
|
||||
{
|
||||
DbgMessage("Invalid VMEntry Relative Virtual Address...");
|
||||
return;
|
||||
}
|
||||
|
||||
auto ImageBaseStr = QInputDialog::getText(0, "Input",
|
||||
"Image Base:", QLineEdit::Normal, "", &Success);
|
||||
|
||||
if (!Success || ImageBaseStr.isEmpty())
|
||||
{
|
||||
DbgMessage("Invalid Image Base...");
|
||||
return;
|
||||
}
|
||||
|
||||
VMEntryRva = VMEntryRvaStr.toULongLong(nullptr, 16);
|
||||
ImageBase = ImageBaseStr.toULongLong(nullptr, 16);
|
||||
|
||||
ModuleBase = reinterpret_cast<std::uintptr_t>(
|
||||
LoadLibraryExA(VMProtectedFilePath.toStdString().c_str(),
|
||||
NULL, DONT_RESOLVE_DLL_REFERENCES));
|
||||
|
||||
const auto TraceFileSize =
|
||||
std::filesystem::file_size(
|
||||
TraceFilePath.toStdString().c_str());
|
||||
|
||||
if (!TraceFileSize)
|
||||
{
|
||||
DbgMessage("Invalid Trace File Size...");
|
||||
return;
|
||||
}
|
||||
|
||||
DbgMessage(QString("Loading Trace File %1...").arg(TraceFilePath));
|
||||
|
||||
// could use a QFile for all of this...
|
||||
const auto FileSize =
|
||||
std::filesystem::file_size(
|
||||
TraceFilePath.toStdString().c_str());
|
||||
|
||||
// could use a QFile for all of this...
|
||||
TraceFileBlob = malloc(FileSize);
|
||||
std::ifstream TFile(TraceFilePath.toStdString().c_str(), std::ios::binary);
|
||||
TFile.read((char*)TraceFileBlob, FileSize);
|
||||
TFile.close();
|
||||
|
||||
if (!InitTraceData())
|
||||
{
|
||||
DbgMessage("Failed To Init Trace Data...");
|
||||
return;
|
||||
}
|
||||
|
||||
UpdateUI();
|
||||
}
|
||||
|
||||
void QVMProfiler::DbgPrint(QString DbgOutput)
|
||||
{
|
||||
ui.DbgOutputWindow->appendPlainText(DbgOutput);
|
||||
}
|
||||
|
||||
void QVMProfiler::DbgMessage(QString DbgOutput)
|
||||
{
|
||||
QMessageBox MsgBox;
|
||||
MsgBox.setText(DbgOutput);
|
||||
MsgBox.exec();
|
||||
DbgPrint(DbgOutput);
|
||||
}
|
||||
|
||||
bool QVMProfiler::InitTraceData()
|
||||
{
|
||||
TraceFileHeader =
|
||||
reinterpret_cast<vmp2::file_header*>(TraceFileBlob);
|
||||
|
||||
TraceEntryList =
|
||||
reinterpret_cast<vmp2::entry_t*>(
|
||||
reinterpret_cast<std::uintptr_t>(
|
||||
TraceFileBlob) + TraceFileHeader->entry_offset);
|
||||
|
||||
const auto TraceMagicBytes = &TraceFileHeader->magic;
|
||||
if (memcmp(TraceMagicBytes, "VMP2", sizeof "VMP2" - 1) != 0)
|
||||
{
|
||||
DbgMessage("Trace File Magic Bytes Are Invalid...\n");
|
||||
return false;
|
||||
}
|
||||
|
||||
DbgPrint("Trace File Magic Bytes Are Valid....");
|
||||
if (!vm::util::flatten(VMEntry, VMEntryRva + ModuleBase))
|
||||
{
|
||||
DbgMessage("Failed To Flatten VMEntry...\n");
|
||||
return false;
|
||||
}
|
||||
|
||||
vm::util::deobfuscate(VMEntry);
|
||||
DbgPrint("Flattened VMEntry...");
|
||||
DbgPrint("Deobfuscated VMEntry...");
|
||||
|
||||
char buffer[256];
|
||||
ZydisFormatter formatter;
|
||||
ZydisFormatterInit(&formatter, ZYDIS_FORMATTER_STYLE_INTEL);
|
||||
|
||||
for (auto& Instr : VMEntry)
|
||||
{
|
||||
ZydisFormatterFormatInstruction(&formatter, &Instr.instr, buffer, sizeof(buffer),
|
||||
(Instr.addr - TraceFileHeader->module_base) + ImageBase);
|
||||
|
||||
DbgPrint(QString("> %1 %2").arg(
|
||||
QString::number((Instr.addr - TraceFileHeader->module_base) + ImageBase, 16)).arg(buffer));
|
||||
}
|
||||
|
||||
VMHandlerTable = vm::handler::table::get(VMEntry);
|
||||
if (!vm::handler::get_all(ModuleBase, ImageBase, VMEntry, VMHandlerTable, VMHandlers))
|
||||
{
|
||||
DbgMessage("Failed To Get All VM Handler Meta Data...\n");
|
||||
return false;
|
||||
}
|
||||
|
||||
DbgPrint("Located All VM Handlers...");
|
||||
VMCtx = new vm::vmctx_t(TraceFileHeader,
|
||||
TraceEntryList, VMHandlers, ModuleBase, ImageBase);
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
void QVMProfiler::UpdateUI()
|
||||
{
|
||||
ui.VirtualInstructionTree->clear();
|
||||
for (auto [VirtInstr, TraceEntry] = VMCtx->step(); TraceEntry && !VirtInstr.empty();
|
||||
std::tie(VirtInstr, TraceEntry) = VMCtx->step())
|
||||
{
|
||||
auto InstructionTraceData = new QTreeWidgetItem();
|
||||
InstructionTraceData->setText(0, QString::number((TraceEntry->vip - TraceFileHeader->module_base) + ImageBase, 16));
|
||||
|
||||
if (VMHandlers[TraceEntry->handler_idx].imm_size)
|
||||
{
|
||||
QString SecondOperandBytes;
|
||||
auto numByteOperand = VMHandlers[TraceEntry->handler_idx].imm_size / 8;
|
||||
auto spaceIdx = VirtInstr.find(" ") + 1;
|
||||
auto ImmValue = QString(VirtInstr.substr(
|
||||
spaceIdx, VirtInstr.size() - spaceIdx).c_str()).toULongLong(nullptr, 16);
|
||||
|
||||
for (auto idx = 0u; idx < numByteOperand; ++idx)
|
||||
{
|
||||
SecondOperandBytes.append(QString::number(*(
|
||||
reinterpret_cast<std::uint8_t*>(&ImmValue) + idx), 16));
|
||||
|
||||
SecondOperandBytes.append(" ");
|
||||
}
|
||||
|
||||
InstructionTraceData->setText(1, QString::number(
|
||||
TraceEntry->handler_idx, 16).append(" - ").append(SecondOperandBytes));
|
||||
}
|
||||
else
|
||||
{
|
||||
// else we just put the first operand byte (vm handler index)...
|
||||
InstructionTraceData->setText(1, QString::number(TraceEntry->handler_idx, 16));
|
||||
}
|
||||
|
||||
InstructionTraceData->setText(2, VirtInstr.c_str());
|
||||
ui.VirtualInstructionTree->addTopLevelItem(InstructionTraceData);
|
||||
}
|
||||
ui.VirtualInstructionTree->topLevelItem(0)->setSelected(true);
|
||||
}
|
||||
|
||||
void QVMProfiler::on_VirtualInstructionTree_itemSelectionChanged()
|
||||
{
|
||||
auto SelectedItem = ui.VirtualInstructionTree->selectedItems()[0];
|
||||
auto VIPAddr = SelectedItem->data(0, 0).toString().toULongLong(nullptr, 16);
|
||||
vmp2::entry_t* Entry = nullptr;
|
||||
|
||||
for (auto idx = 0u; idx < TraceFileHeader->entry_count; ++idx)
|
||||
{
|
||||
if ((TraceEntryList[idx].vip - TraceFileHeader->module_base) + ImageBase == VIPAddr)
|
||||
{
|
||||
Entry = &TraceEntryList[idx];
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
ui.VirtualRegisterTree->topLevelItem(0)->setText(1,
|
||||
QString::number((Entry->vip - TraceFileHeader->module_base) + ImageBase, 16));
|
||||
|
||||
ui.VirtualRegisterTree->topLevelItem(1)->setText(1,
|
||||
QString::number(Entry->regs.rbp, 16));
|
||||
|
||||
ui.VirtualRegisterTree->topLevelItem(2)->setText(1,
|
||||
QString::number(Entry->decrypt_key, 16));
|
||||
|
||||
for (auto idx = 4; idx < 28; ++idx)
|
||||
ui.VirtualRegisterTree->topLevelItem(idx)->setText(1,
|
||||
QString::number(Entry->vregs.qword[idx - 4], 16));
|
||||
|
||||
for (auto idx = 0u; idx < 15; ++idx)
|
||||
ui.NativeRegisterTree->topLevelItem(idx)->setText(1,
|
||||
QString::number(Entry->regs.raw[idx], 16));
|
||||
|
||||
ui.NativeRegisterTree->topLevelItem(
|
||||
16)->setText(1, QString::number(Entry->regs.rflags, 16));
|
||||
|
||||
rflags flags;
|
||||
flags.flags = Entry->regs.rflags;
|
||||
ui.NativeRegisterTree->topLevelItem(16)->child(0)->setText(
|
||||
1, QString::number(flags.zero_flag));
|
||||
|
||||
ui.NativeRegisterTree->topLevelItem(16)->child(1)->setText(
|
||||
1, QString::number(flags.parity_flag));
|
||||
|
||||
ui.NativeRegisterTree->topLevelItem(16)->child(2)->setText(
|
||||
1, QString::number(flags.auxiliary_carry_flag));
|
||||
|
||||
ui.NativeRegisterTree->topLevelItem(16)->child(3)->setText(
|
||||
1, QString::number(flags.overflow_flag));
|
||||
|
||||
ui.NativeRegisterTree->topLevelItem(16)->child(4)->setText(
|
||||
1, QString::number(flags.sign_flag));
|
||||
|
||||
ui.NativeRegisterTree->topLevelItem(16)->child(5)->setText(
|
||||
1, QString::number(flags.direction_flag));
|
||||
|
||||
ui.NativeRegisterTree->topLevelItem(16)->child(6)->setText(
|
||||
1, QString::number(flags.carry_flag));
|
||||
|
||||
ui.NativeRegisterTree->topLevelItem(16)->child(7)->setText(
|
||||
1, QString::number(flags.trap_flag));
|
||||
|
||||
ui.NativeRegisterTree->topLevelItem(16)->child(8)->setText(
|
||||
1, QString::number(flags.interrupt_enable_flag));
|
||||
|
||||
ui.VirtualStackTree->clear();
|
||||
for (auto idx = 0u; idx < sizeof(Entry->vsp) / 8; ++idx)
|
||||
{
|
||||
auto newEntry = new QTreeWidgetItem();
|
||||
newEntry->setText(0, QString::number(Entry->regs.rbp - (idx * 8), 16));
|
||||
newEntry->setText(1, QString::number(Entry->vsp.qword[idx], 16));
|
||||
ui.VirtualStackTree->addTopLevelItem(newEntry);
|
||||
}
|
||||
|
||||
ui.VMHandlerInstructionsTree->clear();
|
||||
auto InstrVec = &VMHandlers[Entry->handler_idx].instrs;
|
||||
|
||||
char buffer[256];
|
||||
ZydisFormatter formatter;
|
||||
ZydisFormatterInit(&formatter, ZYDIS_FORMATTER_STYLE_INTEL);
|
||||
|
||||
for (auto idx = 0u; idx < InstrVec->size(); ++idx)
|
||||
{
|
||||
auto newEntry = new QTreeWidgetItem();
|
||||
newEntry->setText(0, QString::number(
|
||||
(InstrVec->at(idx).addr - TraceFileHeader->module_base) + ImageBase, 16));
|
||||
|
||||
ZydisFormatterFormatInstruction(&formatter, &InstrVec->at(idx).instr,
|
||||
buffer, sizeof(buffer), (InstrVec->at(idx).addr -
|
||||
TraceFileHeader->module_base) + ImageBase);
|
||||
|
||||
newEntry->setText(1, buffer);
|
||||
ui.VMHandlerInstructionsTree->addTopLevelItem(newEntry);
|
||||
}
|
||||
|
||||
ui.VMHandlerTransformationsTree->clear();
|
||||
auto HandlerTransforms = &VMHandlers[Entry->handler_idx].transforms;
|
||||
|
||||
for (auto [TransformType, TransformInstr] : *HandlerTransforms)
|
||||
{
|
||||
auto newEntry = new QTreeWidgetItem();
|
||||
switch (TransformType)
|
||||
{
|
||||
case vm::transform::type::rolling_key:
|
||||
{
|
||||
newEntry->setText(0, "Key Transform");
|
||||
break;
|
||||
}
|
||||
case vm::transform::type::generic1:
|
||||
case vm::transform::type::generic2:
|
||||
case vm::transform::type::generic3:
|
||||
{
|
||||
newEntry->setText(0, "Generic");
|
||||
break;
|
||||
}
|
||||
case vm::transform::type::update_key:
|
||||
{
|
||||
newEntry->setText(0, "Update Key");
|
||||
break;
|
||||
}
|
||||
default:
|
||||
throw std::invalid_argument("invalid transformation type...");
|
||||
}
|
||||
|
||||
ZydisFormatterFormatInstruction(&formatter, &TransformInstr,
|
||||
buffer, sizeof(buffer), NULL);
|
||||
|
||||
newEntry->setText(1, buffer);
|
||||
ui.VMHandlerTransformationsTree->addTopLevelItem(newEntry);
|
||||
}
|
||||
}
|
@ -0,0 +1,48 @@
|
||||
#pragma once
|
||||
#include <QtWidgets/QFileDialog>
|
||||
#include <QtWidgets/QMainWindow>
|
||||
#include <QtWidgets/QMessageBox.h>
|
||||
#include <QtWidgets/QInputDialog.h>
|
||||
#include <Windows.h>
|
||||
#include <filesystem>
|
||||
#include <fstream>
|
||||
|
||||
#include "ui_QVMProfiler.h"
|
||||
#include "vmp2.hpp"
|
||||
#include "vm.h"
|
||||
#include "vmctx.h"
|
||||
#include "ia32.hpp"
|
||||
|
||||
class QVMProfiler : public QMainWindow
|
||||
{
|
||||
Q_OBJECT
|
||||
|
||||
public:
|
||||
QVMProfiler(QWidget *parent = Q_NULLPTR);
|
||||
|
||||
private slots:
|
||||
void on_actionOpen_VMTrace_triggered();
|
||||
void on_actionCloseProgram_triggered();
|
||||
void on_VirtualInstructionTree_itemSelectionChanged();
|
||||
|
||||
private:
|
||||
void DbgPrint(QString DbgOutput);
|
||||
void DbgMessage(QString DbgOutput);
|
||||
void UpdateUI();
|
||||
bool InitTraceData();
|
||||
|
||||
Ui::QVMProfilerClass ui;
|
||||
QString TraceFilePath;
|
||||
QString VMProtectedFilePath;
|
||||
std::uint64_t ImageBase, VMEntryRva, ModuleBase;
|
||||
|
||||
std::vector<vm::handler_t> VMHandlers;
|
||||
zydis_routine_t VMEntry;
|
||||
|
||||
std::uintptr_t* VMHandlerTable;
|
||||
vm::vmctx_t* VMCtx;
|
||||
|
||||
void* TraceFileBlob;
|
||||
vmp2::file_header* TraceFileHeader;
|
||||
vmp2::entry_t* TraceEntryList;
|
||||
};
|
@ -0,0 +1,5 @@
|
||||
<RCC>
|
||||
<qresource prefix="/QVMProfiler">
|
||||
<file>icon.ico</file>
|
||||
</qresource>
|
||||
</RCC>
|
@ -0,0 +1,594 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<ui version="4.0">
|
||||
<class>QVMProfilerClass</class>
|
||||
<widget class="QMainWindow" name="QVMProfilerClass">
|
||||
<property name="geometry">
|
||||
<rect>
|
||||
<x>0</x>
|
||||
<y>0</y>
|
||||
<width>1220</width>
|
||||
<height>1038</height>
|
||||
</rect>
|
||||
</property>
|
||||
<property name="acceptDrops">
|
||||
<bool>true</bool>
|
||||
</property>
|
||||
<property name="windowTitle">
|
||||
<string>VMProfiler</string>
|
||||
</property>
|
||||
<property name="toolTipDuration">
|
||||
<number>0</number>
|
||||
</property>
|
||||
<property name="styleSheet">
|
||||
<string notr="true"/>
|
||||
</property>
|
||||
<widget class="QWidget" name="centralWidget">
|
||||
<layout class="QVBoxLayout" name="verticalLayout_6">
|
||||
<item>
|
||||
<widget class="QGroupBox" name="groupBox">
|
||||
<property name="acceptDrops">
|
||||
<bool>false</bool>
|
||||
</property>
|
||||
<property name="title">
|
||||
<string>Virutal CPU Trace Information</string>
|
||||
</property>
|
||||
<layout class="QHBoxLayout" name="horizontalLayout_2">
|
||||
<item>
|
||||
<widget class="QGroupBox" name="groupBox">
|
||||
<property name="title">
|
||||
<string>Virtual Instructions</string>
|
||||
</property>
|
||||
<layout class="QVBoxLayout" name="verticalLayout_2">
|
||||
<item>
|
||||
<widget class="QScrollArea" name="scrollArea">
|
||||
<property name="widgetResizable">
|
||||
<bool>true</bool>
|
||||
</property>
|
||||
<widget class="QWidget" name="scrollAreaWidgetContents">
|
||||
<property name="geometry">
|
||||
<rect>
|
||||
<x>0</x>
|
||||
<y>0</y>
|
||||
<width>556</width>
|
||||
<height>777</height>
|
||||
</rect>
|
||||
</property>
|
||||
<layout class="QVBoxLayout" name="verticalLayout_5">
|
||||
<item>
|
||||
<widget class="QTreeWidget" name="VirtualInstructionTree">
|
||||
<attribute name="headerDefaultSectionSize">
|
||||
<number>120</number>
|
||||
</attribute>
|
||||
<column>
|
||||
<property name="text">
|
||||
<string>Address</string>
|
||||
</property>
|
||||
</column>
|
||||
<column>
|
||||
<property name="text">
|
||||
<string>Operands</string>
|
||||
</property>
|
||||
</column>
|
||||
<column>
|
||||
<property name="text">
|
||||
<string>Virtual Instruction</string>
|
||||
</property>
|
||||
</column>
|
||||
</widget>
|
||||
</item>
|
||||
</layout>
|
||||
</widget>
|
||||
</widget>
|
||||
</item>
|
||||
</layout>
|
||||
</widget>
|
||||
</item>
|
||||
<item>
|
||||
<widget class="QGroupBox" name="groupBox_2">
|
||||
<property name="title">
|
||||
<string/>
|
||||
</property>
|
||||
<layout class="QVBoxLayout" name="verticalLayout">
|
||||
<item>
|
||||
<widget class="QGroupBox" name="groupBox_3">
|
||||
<property name="title">
|
||||
<string>Registers</string>
|
||||
</property>
|
||||
<layout class="QHBoxLayout" name="horizontalLayout_3">
|
||||
<item>
|
||||
<widget class="QTreeWidget" name="VirtualRegisterTree">
|
||||
<attribute name="headerDefaultSectionSize">
|
||||
<number>65</number>
|
||||
</attribute>
|
||||
<column>
|
||||
<property name="text">
|
||||
<string>Register</string>
|
||||
</property>
|
||||
</column>
|
||||
<column>
|
||||
<property name="text">
|
||||
<string>Value</string>
|
||||
</property>
|
||||
</column>
|
||||
<item>
|
||||
<property name="text">
|
||||
<string>VIP</string>
|
||||
</property>
|
||||
</item>
|
||||
<item>
|
||||
<property name="text">
|
||||
<string>VSP</string>
|
||||
</property>
|
||||
</item>
|
||||
<item>
|
||||
<property name="text">
|
||||
<string>DKEY</string>
|
||||
</property>
|
||||
</item>
|
||||
<item>
|
||||
<property name="text">
|
||||
<string/>
|
||||
</property>
|
||||
</item>
|
||||
<item>
|
||||
<property name="text">
|
||||
<string>vreg0</string>
|
||||
</property>
|
||||
<property name="text">
|
||||
<string/>
|
||||
</property>
|
||||
</item>
|
||||
<item>
|
||||
<property name="text">
|
||||
<string>vreg1</string>
|
||||
</property>
|
||||
</item>
|
||||
<item>
|
||||
<property name="text">
|
||||
<string>vreg2</string>
|
||||
</property>
|
||||
</item>
|
||||
<item>
|
||||
<property name="text">
|
||||
<string>vreg3</string>
|
||||
</property>
|
||||
</item>
|
||||
<item>
|
||||
<property name="text">
|
||||
<string>vreg4</string>
|
||||
</property>
|
||||
</item>
|
||||
<item>
|
||||
<property name="text">
|
||||
<string>vreg5</string>
|
||||
</property>
|
||||
</item>
|
||||
<item>
|
||||
<property name="text">
|
||||
<string>vreg6</string>
|
||||
</property>
|
||||
</item>
|
||||
<item>
|
||||
<property name="text">
|
||||
<string>vreg7</string>
|
||||
</property>
|
||||
</item>
|
||||
<item>
|
||||
<property name="text">
|
||||
<string>vreg8</string>
|
||||
</property>
|
||||
</item>
|
||||
<item>
|
||||
<property name="text">
|
||||
<string>vreg9</string>
|
||||
</property>
|
||||
</item>
|
||||
<item>
|
||||
<property name="text">
|
||||
<string>vreg10</string>
|
||||
</property>
|
||||
</item>
|
||||
<item>
|
||||
<property name="text">
|
||||
<string>vreg11</string>
|
||||
</property>
|
||||
</item>
|
||||
<item>
|
||||
<property name="text">
|
||||
<string>vreg12</string>
|
||||
</property>
|
||||
</item>
|
||||
<item>
|
||||
<property name="text">
|
||||
<string>vreg13</string>
|
||||
</property>
|
||||
</item>
|
||||
<item>
|
||||
<property name="text">
|
||||
<string>vreg14</string>
|
||||
</property>
|
||||
</item>
|
||||
<item>
|
||||
<property name="text">
|
||||
<string>vreg15</string>
|
||||
</property>
|
||||
</item>
|
||||
<item>
|
||||
<property name="text">
|
||||
<string>vreg16</string>
|
||||
</property>
|
||||
</item>
|
||||
<item>
|
||||
<property name="text">
|
||||
<string>vreg17</string>
|
||||
</property>
|
||||
</item>
|
||||
<item>
|
||||
<property name="text">
|
||||
<string>vreg18</string>
|
||||
</property>
|
||||
</item>
|
||||
<item>
|
||||
<property name="text">
|
||||
<string>vreg19</string>
|
||||
</property>
|
||||
</item>
|
||||
<item>
|
||||
<property name="text">
|
||||
<string>vreg20</string>
|
||||
</property>
|
||||
</item>
|
||||
<item>
|
||||
<property name="text">
|
||||
<string>vreg21</string>
|
||||
</property>
|
||||
</item>
|
||||
<item>
|
||||
<property name="text">
|
||||
<string>vreg22</string>
|
||||
</property>
|
||||
</item>
|
||||
<item>
|
||||
<property name="text">
|
||||
<string>vreg23</string>
|
||||
</property>
|
||||
</item>
|
||||
</widget>
|
||||
</item>
|
||||
<item>
|
||||
<widget class="QTreeWidget" name="NativeRegisterTree">
|
||||
<attribute name="headerDefaultSectionSize">
|
||||
<number>70</number>
|
||||
</attribute>
|
||||
<column>
|
||||
<property name="text">
|
||||
<string>Register</string>
|
||||
</property>
|
||||
</column>
|
||||
<column>
|
||||
<property name="text">
|
||||
<string>Value</string>
|
||||
</property>
|
||||
</column>
|
||||
<item>
|
||||
<property name="text">
|
||||
<string>R15</string>
|
||||
</property>
|
||||
</item>
|
||||
<item>
|
||||
<property name="text">
|
||||
<string>R14</string>
|
||||
</property>
|
||||
</item>
|
||||
<item>
|
||||
<property name="text">
|
||||
<string>R13</string>
|
||||
</property>
|
||||
</item>
|
||||
<item>
|
||||
<property name="text">
|
||||
<string>R12</string>
|
||||
</property>
|
||||
</item>
|
||||
<item>
|
||||
<property name="text">
|
||||
<string>R11</string>
|
||||
</property>
|
||||
</item>
|
||||
<item>
|
||||
<property name="text">
|
||||
<string>R10</string>
|
||||
</property>
|
||||
</item>
|
||||
<item>
|
||||
<property name="text">
|
||||
<string>R9</string>
|
||||
</property>
|
||||
</item>
|
||||
<item>
|
||||
<property name="text">
|
||||
<string>R8</string>
|
||||
</property>
|
||||
</item>
|
||||
<item>
|
||||
<property name="text">
|
||||
<string>RBP</string>
|
||||
</property>
|
||||
</item>
|
||||
<item>
|
||||
<property name="text">
|
||||
<string>RDI</string>
|
||||
</property>
|
||||
</item>
|
||||
<item>
|
||||
<property name="text">
|
||||
<string>RSI</string>
|
||||
</property>
|
||||
</item>
|
||||
<item>
|
||||
<property name="text">
|
||||
<string>RDX</string>
|
||||
</property>
|
||||
</item>
|
||||
<item>
|
||||
<property name="text">
|
||||
<string>RCX</string>
|
||||
</property>
|
||||
</item>
|
||||
<item>
|
||||
<property name="text">
|
||||
<string>RBX</string>
|
||||
</property>
|
||||
</item>
|
||||
<item>
|
||||
<property name="text">
|
||||
<string>RAX</string>
|
||||
</property>
|
||||
</item>
|
||||
<item>
|
||||
<property name="text">
|
||||
<string/>
|
||||
</property>
|
||||
</item>
|
||||
<item>
|
||||
<property name="text">
|
||||
<string>RFLAGS</string>
|
||||
</property>
|
||||
<item>
|
||||
<property name="text">
|
||||
<string>ZF</string>
|
||||
</property>
|
||||
</item>
|
||||
<item>
|
||||
<property name="text">
|
||||
<string>PF</string>
|
||||
</property>
|
||||
</item>
|
||||
<item>
|
||||
<property name="text">
|
||||
<string>AF</string>
|
||||
</property>
|
||||
</item>
|
||||
<item>
|
||||
<property name="text">
|
||||
<string>OF</string>
|
||||
</property>
|
||||
</item>
|
||||
<item>
|
||||
<property name="text">
|
||||
<string>SF</string>
|
||||
</property>
|
||||
</item>
|
||||
<item>
|
||||
<property name="text">
|
||||
<string>DF</string>
|
||||
</property>
|
||||
</item>
|
||||
<item>
|
||||
<property name="text">
|
||||
<string>CF</string>
|
||||
</property>
|
||||
</item>
|
||||
<item>
|
||||
<property name="text">
|
||||
<string>TF</string>
|
||||
</property>
|
||||
</item>
|
||||
<item>
|
||||
<property name="text">
|
||||
<string>IF</string>
|
||||
</property>
|
||||
</item>
|
||||
</item>
|
||||
</widget>
|
||||
</item>
|
||||
</layout>
|
||||
</widget>
|
||||
</item>
|
||||
<item>
|
||||
<widget class="QGroupBox" name="groupBox_4">
|
||||
<property name="title">
|
||||
<string>Virtual Stack</string>
|
||||
</property>
|
||||
<layout class="QVBoxLayout" name="verticalLayout_4">
|
||||
<item>
|
||||
<widget class="QScrollArea" name="scrollArea_3">
|
||||
<property name="widgetResizable">
|
||||
<bool>true</bool>
|
||||
</property>
|
||||
<widget class="QWidget" name="scrollAreaWidgetContents_3">
|
||||
<property name="geometry">
|
||||
<rect>
|
||||
<x>0</x>
|
||||
<y>0</y>
|
||||
<width>556</width>
|
||||
<height>225</height>
|
||||
</rect>
|
||||
</property>
|
||||
<layout class="QVBoxLayout" name="verticalLayout_3">
|
||||
<item>
|
||||
<widget class="QTreeWidget" name="VirtualStackTree">
|
||||
<column>
|
||||
<property name="text">
|
||||
<string>Stack Pointer</string>
|
||||
</property>
|
||||
</column>
|
||||
<column>
|
||||
<property name="text">
|
||||
<string>Value</string>
|
||||
</property>
|
||||
</column>
|
||||
</widget>
|
||||
</item>
|
||||
</layout>
|
||||
</widget>
|
||||
</widget>
|
||||
</item>
|
||||
</layout>
|
||||
</widget>
|
||||
</item>
|
||||
<item>
|
||||
<widget class="QGroupBox" name="groupBox_5">
|
||||
<property name="title">
|
||||
<string>Virtual Machine Instruction Handler</string>
|
||||
</property>
|
||||
<layout class="QHBoxLayout" name="horizontalLayout">
|
||||
<item>
|
||||
<widget class="QGroupBox" name="groupBox_6">
|
||||
<property name="title">
|
||||
<string>VM Handler Instructions</string>
|
||||
</property>
|
||||
<layout class="QVBoxLayout" name="verticalLayout_8">
|
||||
<item>
|
||||
<widget class="QTreeWidget" name="VMHandlerInstructionsTree">
|
||||
<column>
|
||||
<property name="text">
|
||||
<string>Address</string>
|
||||
</property>
|
||||
</column>
|
||||
<column>
|
||||
<property name="text">
|
||||
<string>Instruction</string>
|
||||
</property>
|
||||
</column>
|
||||
</widget>
|
||||
</item>
|
||||
</layout>
|
||||
</widget>
|
||||
</item>
|
||||
<item>
|
||||
<widget class="QGroupBox" name="groupBox_7">
|
||||
<property name="title">
|
||||
<string>VM Handler Transformations</string>
|
||||
</property>
|
||||
<layout class="QVBoxLayout" name="verticalLayout_9">
|
||||
<item>
|
||||
<widget class="QTreeWidget" name="VMHandlerTransformationsTree">
|
||||
<column>
|
||||
<property name="text">
|
||||
<string>Address</string>
|
||||
</property>
|
||||
</column>
|
||||
<column>
|
||||
<property name="text">
|
||||
<string>Instruction</string>
|
||||
</property>
|
||||
</column>
|
||||
</widget>
|
||||
</item>
|
||||
</layout>
|
||||
</widget>
|
||||
</item>
|
||||
</layout>
|
||||
</widget>
|
||||
</item>
|
||||
</layout>
|
||||
</widget>
|
||||
</item>
|
||||
</layout>
|
||||
</widget>
|
||||
</item>
|
||||
</layout>
|
||||
</widget>
|
||||
<widget class="QMenuBar" name="menuBar">
|
||||
<property name="geometry">
|
||||
<rect>
|
||||
<x>0</x>
|
||||
<y>0</y>
|
||||
<width>1220</width>
|
||||
<height>21</height>
|
||||
</rect>
|
||||
</property>
|
||||
<widget class="QMenu" name="menuOpen_VMTrace">
|
||||
<property name="title">
|
||||
<string>File</string>
|
||||
</property>
|
||||
<addaction name="actionOpen_VMTrace"/>
|
||||
<addaction name="actionCloseProgram"/>
|
||||
</widget>
|
||||
<addaction name="menuOpen_VMTrace"/>
|
||||
</widget>
|
||||
<widget class="QDockWidget" name="dockWidget">
|
||||
<property name="minimumSize">
|
||||
<size>
|
||||
<width>89</width>
|
||||
<height>150</height>
|
||||
</size>
|
||||
</property>
|
||||
<property name="maximumSize">
|
||||
<size>
|
||||
<width>524287</width>
|
||||
<height>150</height>
|
||||
</size>
|
||||
</property>
|
||||
<property name="baseSize">
|
||||
<size>
|
||||
<width>89</width>
|
||||
<height>150</height>
|
||||
</size>
|
||||
</property>
|
||||
<property name="windowTitle">
|
||||
<string>Debug Log</string>
|
||||
</property>
|
||||
<attribute name="dockWidgetArea">
|
||||
<number>8</number>
|
||||
</attribute>
|
||||
<widget class="QWidget" name="dockWidgetContents">
|
||||
<layout class="QVBoxLayout" name="verticalLayout_7">
|
||||
<item>
|
||||
<widget class="QPlainTextEdit" name="DbgOutputWindow">
|
||||
<property name="readOnly">
|
||||
<bool>true</bool>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
</layout>
|
||||
</widget>
|
||||
</widget>
|
||||
<action name="actionOpen">
|
||||
<property name="text">
|
||||
<string>Open</string>
|
||||
</property>
|
||||
</action>
|
||||
<action name="actionClose">
|
||||
<property name="text">
|
||||
<string>Close</string>
|
||||
</property>
|
||||
</action>
|
||||
<action name="actionOpen_VMTrace">
|
||||
<property name="text">
|
||||
<string>Open Trace</string>
|
||||
</property>
|
||||
</action>
|
||||
<action name="actionCloseProgram">
|
||||
<property name="text">
|
||||
<string>Close</string>
|
||||
</property>
|
||||
</action>
|
||||
</widget>
|
||||
<layoutdefault spacing="6" margin="11"/>
|
||||
<resources>
|
||||
<include location="QVMProfiler.qrc"/>
|
||||
</resources>
|
||||
<connections/>
|
||||
</ui>
|
After Width: | Height: | Size: 227 KiB |
@ -0,0 +1,3 @@
|
||||
// Icon Resource Definition
|
||||
#define MAIN_ICON 102
|
||||
MAIN_ICON ICON "icon.ico"
|
@ -0,0 +1,18 @@
|
||||
#include <QtWidgets/QApplication>
|
||||
#include <QFile>
|
||||
#include <QTextStream>
|
||||
#include "QVMProfiler.h"
|
||||
|
||||
#include "framelesswindow.h"
|
||||
#include "DarkStyle.h"
|
||||
|
||||
int main(int argc, char *argv[])
|
||||
{
|
||||
QApplication app(argc, argv);
|
||||
QApplication::setStyle(new DarkStyle);
|
||||
FramelessWindow framelessWindow;
|
||||
framelessWindow.setContent(new QVMProfiler);
|
||||
framelessWindow.setWindowIcon(QIcon("icon.ico"));
|
||||
framelessWindow.show();
|
||||
return app.exec();
|
||||
}
|
@ -0,0 +1,196 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
|
||||
<ItemGroup>
|
||||
<ClCompile Include="QVMProfiler.cpp">
|
||||
<Filter>Source Files</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="main.cpp">
|
||||
<Filter>Source Files</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="DarkStyle\framelesswindow\framelesswindow.cpp">
|
||||
<Filter>Source Files\DarkStyle\framelesswindow</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="DarkStyle\framelesswindow\windowdragger.cpp">
|
||||
<Filter>Source Files\DarkStyle\framelesswindow</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="DarkStyle\DarkStyle.cpp">
|
||||
<Filter>Source Files\DarkStyle</Filter>
|
||||
</ClCompile>
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<Filter Include="Header Files">
|
||||
<UniqueIdentifier>{841656a6-8f18-40f6-88cc-63394509aec2}</UniqueIdentifier>
|
||||
</Filter>
|
||||
<Filter Include="Source Files">
|
||||
<UniqueIdentifier>{b94916d4-6db7-4a7c-bfe5-f2ae9acd3b54}</UniqueIdentifier>
|
||||
</Filter>
|
||||
<Filter Include="Resource Files">
|
||||
<UniqueIdentifier>{8c45819e-3375-4fa3-81c3-ef06ca9b22f8}</UniqueIdentifier>
|
||||
</Filter>
|
||||
<Filter Include="Header Files\DarkStyle">
|
||||
<UniqueIdentifier>{412fa996-96ab-4202-88d8-4f5d8c303483}</UniqueIdentifier>
|
||||
</Filter>
|
||||
<Filter Include="Header Files\DarkStyle\framelesswindow">
|
||||
<UniqueIdentifier>{8e5d2814-ebf7-49a1-b226-71e5efcc79aa}</UniqueIdentifier>
|
||||
</Filter>
|
||||
<Filter Include="Source Files\DarkStyle">
|
||||
<UniqueIdentifier>{ab85244a-db4d-4aef-a6e5-cb51b205206f}</UniqueIdentifier>
|
||||
</Filter>
|
||||
<Filter Include="Source Files\DarkStyle\framelesswindow">
|
||||
<UniqueIdentifier>{ab0c8bb3-a7db-47a7-ad9f-da0b8569eea1}</UniqueIdentifier>
|
||||
</Filter>
|
||||
<Filter Include="Header Files\vmprofiler">
|
||||
<UniqueIdentifier>{5f579aad-1e93-4542-9e34-7f59aaee46da}</UniqueIdentifier>
|
||||
</Filter>
|
||||
<Filter Include="Header Files\vmprofiler\Zydis">
|
||||
<UniqueIdentifier>{b0071ba0-39c0-4018-8575-29ae093557cb}</UniqueIdentifier>
|
||||
</Filter>
|
||||
<Filter Include="Header Files\vmprofiler\Zydis\Generated">
|
||||
<UniqueIdentifier>{eb951f82-57a0-4854-bd37-1d837c3b55f5}</UniqueIdentifier>
|
||||
</Filter>
|
||||
<Filter Include="Header Files\vmprofiler\Zydis\Internal">
|
||||
<UniqueIdentifier>{ee615592-4e69-4d91-9a33-bd1ef26cc6a2}</UniqueIdentifier>
|
||||
</Filter>
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<QtRcc Include="QVMProfiler.qrc">
|
||||
<Filter>Resource Files</Filter>
|
||||
</QtRcc>
|
||||
<QtRcc Include="DarkStyle\darkstyle.qrc">
|
||||
<Filter>Resource Files</Filter>
|
||||
</QtRcc>
|
||||
<QtRcc Include="DarkStyle\framelesswindow.qrc">
|
||||
<Filter>Resource Files</Filter>
|
||||
</QtRcc>
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<QtUic Include="QVMProfiler.ui">
|
||||
<Filter>Resource Files</Filter>
|
||||
</QtUic>
|
||||
<QtUic Include="DarkStyle\framelesswindow\framelesswindow.ui">
|
||||
<Filter>Resource Files</Filter>
|
||||
</QtUic>
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<QtMoc Include="QVMProfiler.h">
|
||||
<Filter>Header Files</Filter>
|
||||
</QtMoc>
|
||||
<QtMoc Include="DarkStyle\framelesswindow\framelesswindow.h">
|
||||
<Filter>Header Files\DarkStyle\framelesswindow</Filter>
|
||||
</QtMoc>
|
||||
<QtMoc Include="DarkStyle\framelesswindow\windowdragger.h">
|
||||
<Filter>Header Files\DarkStyle\framelesswindow</Filter>
|
||||
</QtMoc>
|
||||
<QtMoc Include="DarkStyle\DarkStyle.h">
|
||||
<Filter>Header Files\DarkStyle</Filter>
|
||||
</QtMoc>
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<ClInclude Include="ia32.hpp">
|
||||
<Filter>Header Files</Filter>
|
||||
</ClInclude>
|
||||
<ClInclude Include="..\dependencies\vmprofiler\include\transform.hpp">
|
||||
<Filter>Header Files\vmprofiler</Filter>
|
||||
</ClInclude>
|
||||
<ClInclude Include="..\dependencies\vmprofiler\include\vm.h">
|
||||
<Filter>Header Files\vmprofiler</Filter>
|
||||
</ClInclude>
|
||||
<ClInclude Include="..\dependencies\vmprofiler\include\vmctx.h">
|
||||
<Filter>Header Files\vmprofiler</Filter>
|
||||
</ClInclude>
|
||||
<ClInclude Include="..\dependencies\vmprofiler\include\vmp2.hpp">
|
||||
<Filter>Header Files\vmprofiler</Filter>
|
||||
</ClInclude>
|
||||
<ClInclude Include="..\dependencies\vmprofiler\include\vmprofiler.hpp">
|
||||
<Filter>Header Files\vmprofiler</Filter>
|
||||
</ClInclude>
|
||||
<ClInclude Include="..\dependencies\vmprofiler\include\vmutils.h">
|
||||
<Filter>Header Files\vmprofiler</Filter>
|
||||
</ClInclude>
|
||||
<ClInclude Include="..\dependencies\vmprofiler\include\ZycoreExportConfig.h">
|
||||
<Filter>Header Files\vmprofiler</Filter>
|
||||
</ClInclude>
|
||||
<ClInclude Include="..\dependencies\vmprofiler\include\ZydisExportConfig.h">
|
||||
<Filter>Header Files\vmprofiler</Filter>
|
||||
</ClInclude>
|
||||
<ClInclude Include="..\dependencies\vmprofiler\include\Zydis\Decoder.h">
|
||||
<Filter>Header Files\vmprofiler\Zydis</Filter>
|
||||
</ClInclude>
|
||||
<ClInclude Include="..\dependencies\vmprofiler\include\Zydis\DecoderTypes.h">
|
||||
<Filter>Header Files\vmprofiler\Zydis</Filter>
|
||||
</ClInclude>
|
||||
<ClInclude Include="..\dependencies\vmprofiler\include\Zydis\Formatter.h">
|
||||
<Filter>Header Files\vmprofiler\Zydis</Filter>
|
||||
</ClInclude>
|
||||
<ClInclude Include="..\dependencies\vmprofiler\include\Zydis\FormatterBuffer.h">
|
||||
<Filter>Header Files\vmprofiler\Zydis</Filter>
|
||||
</ClInclude>
|
||||
<ClInclude Include="..\dependencies\vmprofiler\include\Zydis\MetaInfo.h">
|
||||
<Filter>Header Files\vmprofiler\Zydis</Filter>
|
||||
</ClInclude>
|
||||
<ClInclude Include="..\dependencies\vmprofiler\include\Zydis\Mnemonic.h">
|
||||
<Filter>Header Files\vmprofiler\Zydis</Filter>
|
||||
</ClInclude>
|
||||
<ClInclude Include="..\dependencies\vmprofiler\include\Zydis\Register.h">
|
||||
<Filter>Header Files\vmprofiler\Zydis</Filter>
|
||||
</ClInclude>
|
||||
<ClInclude Include="..\dependencies\vmprofiler\include\Zydis\SharedTypes.h">
|
||||
<Filter>Header Files\vmprofiler\Zydis</Filter>
|
||||
</ClInclude>
|
||||
<ClInclude Include="..\dependencies\vmprofiler\include\Zydis\ShortString.h">
|
||||
<Filter>Header Files\vmprofiler\Zydis</Filter>
|
||||
</ClInclude>
|
||||
<ClInclude Include="..\dependencies\vmprofiler\include\Zydis\Status.h">
|
||||
<Filter>Header Files\vmprofiler\Zydis</Filter>
|
||||
</ClInclude>
|
||||
<ClInclude Include="..\dependencies\vmprofiler\include\Zydis\Utils.h">
|
||||
<Filter>Header Files\vmprofiler\Zydis</Filter>
|
||||
</ClInclude>
|
||||
<ClInclude Include="..\dependencies\vmprofiler\include\Zydis\Zydis.h">
|
||||
<Filter>Header Files\vmprofiler\Zydis</Filter>
|
||||
</ClInclude>
|
||||
<ClInclude Include="..\dependencies\vmprofiler\include\Zydis\Generated\EnumInstructionCategory.h">
|
||||
<Filter>Header Files\vmprofiler\Zydis\Generated</Filter>
|
||||
</ClInclude>
|
||||
<ClInclude Include="..\dependencies\vmprofiler\include\Zydis\Generated\EnumISAExt.h">
|
||||
<Filter>Header Files\vmprofiler\Zydis\Generated</Filter>
|
||||
</ClInclude>
|
||||
<ClInclude Include="..\dependencies\vmprofiler\include\Zydis\Generated\EnumISASet.h">
|
||||
<Filter>Header Files\vmprofiler\Zydis\Generated</Filter>
|
||||
</ClInclude>
|
||||
<ClInclude Include="..\dependencies\vmprofiler\include\Zydis\Generated\EnumMnemonic.h">
|
||||
<Filter>Header Files\vmprofiler\Zydis\Generated</Filter>
|
||||
</ClInclude>
|
||||
<ClInclude Include="..\dependencies\vmprofiler\include\Zydis\Generated\EnumRegister.h">
|
||||
<Filter>Header Files\vmprofiler\Zydis\Generated</Filter>
|
||||
</ClInclude>
|
||||
<ClInclude Include="..\dependencies\vmprofiler\include\Zydis\Internal\DecoderData.h">
|
||||
<Filter>Header Files\vmprofiler\Zydis\Internal</Filter>
|
||||
</ClInclude>
|
||||
<ClInclude Include="..\dependencies\vmprofiler\include\Zydis\Internal\FormatterATT.h">
|
||||
<Filter>Header Files\vmprofiler\Zydis\Internal</Filter>
|
||||
</ClInclude>
|
||||
<ClInclude Include="..\dependencies\vmprofiler\include\Zydis\Internal\FormatterBase.h">
|
||||
<Filter>Header Files\vmprofiler\Zydis\Internal</Filter>
|
||||
</ClInclude>
|
||||
<ClInclude Include="..\dependencies\vmprofiler\include\Zydis\Internal\FormatterIntel.h">
|
||||
<Filter>Header Files\vmprofiler\Zydis\Internal</Filter>
|
||||
</ClInclude>
|
||||
<ClInclude Include="..\dependencies\vmprofiler\include\Zydis\Internal\SharedData.h">
|
||||
<Filter>Header Files\vmprofiler\Zydis\Internal</Filter>
|
||||
</ClInclude>
|
||||
<ClInclude Include="..\dependencies\vmprofiler\include\Zydis\Internal\String.h">
|
||||
<Filter>Header Files\vmprofiler\Zydis\Internal</Filter>
|
||||
</ClInclude>
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<Image Include="icon.ico">
|
||||
<Filter>Resource Files</Filter>
|
||||
</Image>
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<ResourceCompile Include="icon.rc">
|
||||
<Filter>Resource Files</Filter>
|
||||
</ResourceCompile>
|
||||
</ItemGroup>
|
||||
</Project>
|
@ -0,0 +1,4 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<Project ToolsVersion="Current" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
|
||||
<PropertyGroup />
|
||||
</Project>
|
@ -0,0 +1,57 @@
|
||||
<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
|
||||
<PropertyGroup>
|
||||
<Qt_DEFINES_>UNICODE;_UNICODE;WIN32;_ENABLE_EXTENDED_ALIGNED_STORAGE;WIN64;QT_WIDGETS_LIB;QT_GUI_LIB;QT_CORE_LIB</Qt_DEFINES_>
|
||||
<Qt_INCLUDEPATH_>G:\Qt\5.15.1\msvc2019_64\include;G:\Qt\5.15.1\msvc2019_64\include\QtWidgets;G:\Qt\5.15.1\msvc2019_64\include\QtGui;G:\Qt\5.15.1\msvc2019_64\include\QtANGLE;G:\Qt\5.15.1\msvc2019_64\include\QtCore;/include;G:\Qt\5.15.1\msvc2019_64\mkspecs\win32-msvc</Qt_INCLUDEPATH_>
|
||||
<Qt_LIBS_>G:\Qt\5.15.1\msvc2019_64\lib\Qt5Widgetsd.lib;G:\Qt\5.15.1\msvc2019_64\lib\Qt5Guid.lib;G:\Qt\5.15.1\msvc2019_64\lib\Qt5Cored.lib;G:\Qt\5.15.1\msvc2019_64\lib\qtmaind.lib;shell32.lib</Qt_LIBS_>
|
||||
<Qt_LIBPATH_>C:\openssl\lib;C:\Utils\my_sql\mysql-5.7.25-winx64\lib;C:\Utils\postgresql\pgsql\lib</Qt_LIBPATH_>
|
||||
<QMake_QT_SYSROOT_></QMake_QT_SYSROOT_>
|
||||
<QMake_QT_INSTALL_PREFIX_>G:/Qt/5.15.1/msvc2019_64</QMake_QT_INSTALL_PREFIX_>
|
||||
<QMake_QT_INSTALL_ARCHDATA_>G:/Qt/5.15.1/msvc2019_64</QMake_QT_INSTALL_ARCHDATA_>
|
||||
<QMake_QT_INSTALL_DATA_>G:/Qt/5.15.1/msvc2019_64</QMake_QT_INSTALL_DATA_>
|
||||
<QMake_QT_INSTALL_DOCS_>G:/Qt/Docs/Qt-5.15.1</QMake_QT_INSTALL_DOCS_>
|
||||
<QMake_QT_INSTALL_HEADERS_>G:/Qt/5.15.1/msvc2019_64/include</QMake_QT_INSTALL_HEADERS_>
|
||||
<QMake_QT_INSTALL_LIBS_>G:/Qt/5.15.1/msvc2019_64/lib</QMake_QT_INSTALL_LIBS_>
|
||||
<QMake_QT_INSTALL_LIBEXECS_>G:/Qt/5.15.1/msvc2019_64/bin</QMake_QT_INSTALL_LIBEXECS_>
|
||||
<QMake_QT_INSTALL_BINS_>G:/Qt/5.15.1/msvc2019_64/bin</QMake_QT_INSTALL_BINS_>
|
||||
<QMake_QT_INSTALL_TESTS_>G:/Qt/5.15.1/msvc2019_64/tests</QMake_QT_INSTALL_TESTS_>
|
||||
<QMake_QT_INSTALL_PLUGINS_>G:/Qt/5.15.1/msvc2019_64/plugins</QMake_QT_INSTALL_PLUGINS_>
|
||||
<QMake_QT_INSTALL_IMPORTS_>G:/Qt/5.15.1/msvc2019_64/imports</QMake_QT_INSTALL_IMPORTS_>
|
||||
<QMake_QT_INSTALL_QML_>G:/Qt/5.15.1/msvc2019_64/qml</QMake_QT_INSTALL_QML_>
|
||||
<QMake_QT_INSTALL_TRANSLATIONS_>G:/Qt/5.15.1/msvc2019_64/translations</QMake_QT_INSTALL_TRANSLATIONS_>
|
||||
<QMake_QT_INSTALL_CONFIGURATION_></QMake_QT_INSTALL_CONFIGURATION_>
|
||||
<QMake_QT_INSTALL_EXAMPLES_>G:/Qt/Examples/Qt-5.15.1</QMake_QT_INSTALL_EXAMPLES_>
|
||||
<QMake_QT_INSTALL_DEMOS_>G:/Qt/Examples/Qt-5.15.1</QMake_QT_INSTALL_DEMOS_>
|
||||
<QMake_QT_HOST_PREFIX_>G:/Qt/5.15.1/msvc2019_64</QMake_QT_HOST_PREFIX_>
|
||||
<QMake_QT_HOST_DATA_>G:/Qt/5.15.1/msvc2019_64</QMake_QT_HOST_DATA_>
|
||||
<QMake_QT_HOST_BINS_>G:/Qt/5.15.1/msvc2019_64/bin</QMake_QT_HOST_BINS_>
|
||||
<QMake_QT_HOST_LIBS_>G:/Qt/5.15.1/msvc2019_64/lib</QMake_QT_HOST_LIBS_>
|
||||
<QMake_QMAKE_SPEC_>win32-msvc</QMake_QMAKE_SPEC_>
|
||||
<QMake_QMAKE_XSPEC_>win32-msvc</QMake_QMAKE_XSPEC_>
|
||||
<QMake_QMAKE_VERSION_>3.1</QMake_QMAKE_VERSION_>
|
||||
<QMake_QT_VERSION_>5.15.1</QMake_QT_VERSION_>
|
||||
<Qt_INCLUDEPATH_
|
||||
>$(Qt_INCLUDEPATH_);x64\Debug\moc;x64\Debug\uic</Qt_INCLUDEPATH_>
|
||||
<QtBkup_QtInstall
|
||||
>5.15.1</QtBkup_QtInstall>
|
||||
<QtBkup_QtModules
|
||||
>core;gui;widgets</QtBkup_QtModules>
|
||||
<QtBkup_QtPathBinaries
|
||||
>bin</QtBkup_QtPathBinaries>
|
||||
<QtBkup_QtPathLibraryExecutables
|
||||
>bin</QtBkup_QtPathLibraryExecutables>
|
||||
<QtBkup_QtHeaderSearchPath
|
||||
></QtBkup_QtHeaderSearchPath>
|
||||
<QtBkup_QtLibrarySearchPath
|
||||
></QtBkup_QtLibrarySearchPath>
|
||||
<QtBkup_QtVars
|
||||
>DEFINES=/-D([^\s=]+(=(\x22(\\\\|\\\x22|[^\x22])*\x22|\S+))?)/$1/;INCLUDEPATH=INCPATH/-(?:iquote|isystem|idirafter|I)\s*(\x22[^\x22]+\x22|[^\s]+)/$1/;LIBS=/(?:(?:\/LIBPATH:|-L)(?:\x22[^\x22]+\x22|[^\s]+))|(\x22[^\x22]+\x22|[^\s]+)/$1/;LIBPATH=LIBS/(?:\/LIBPATH:|-L)(\x22[^\x22]+\x22|[^\s]+)/$1/</QtBkup_QtVars>
|
||||
<QtBkup_QMakeCodeLines
|
||||
></QtBkup_QMakeCodeLines>
|
||||
<QtBkup_QtBuildConfig
|
||||
>debug</QtBkup_QtBuildConfig>
|
||||
<QtVersion>5.15.1</QtVersion>
|
||||
<QtVersionMajor>5</QtVersionMajor>
|
||||
<QtVersionMinor>15</QtVersionMinor>
|
||||
<QtVersionPatch>1</QtVersionPatch>
|
||||
</PropertyGroup>
|
||||
</Project>
|
@ -0,0 +1,7 @@
|
||||
QMAKE_CXX.QT_COMPILER_STDCXX = 199711L
|
||||
QMAKE_CXX.QMAKE_MSC_VER = 1928
|
||||
QMAKE_CXX.QMAKE_MSC_FULL_VER = 192829336
|
||||
QMAKE_CXX.COMPILER_MACROS = \
|
||||
QT_COMPILER_STDCXX \
|
||||
QMAKE_MSC_VER \
|
||||
QMAKE_MSC_FULL_VER
|
@ -0,0 +1 @@
|
||||
C:\Users\_xeroxz\AppData\Local\Temp\y4asezfz.dgr.designtime.props
|
@ -0,0 +1,25 @@
|
||||
QT_SYSROOT:
|
||||
QT_INSTALL_PREFIX:G:/Qt/5.15.1/msvc2019_64
|
||||
QT_INSTALL_ARCHDATA:G:/Qt/5.15.1/msvc2019_64
|
||||
QT_INSTALL_DATA:G:/Qt/5.15.1/msvc2019_64
|
||||
QT_INSTALL_DOCS:G:/Qt/Docs/Qt-5.15.1
|
||||
QT_INSTALL_HEADERS:G:/Qt/5.15.1/msvc2019_64/include
|
||||
QT_INSTALL_LIBS:G:/Qt/5.15.1/msvc2019_64/lib
|
||||
QT_INSTALL_LIBEXECS:G:/Qt/5.15.1/msvc2019_64/bin
|
||||
QT_INSTALL_BINS:G:/Qt/5.15.1/msvc2019_64/bin
|
||||
QT_INSTALL_TESTS:G:/Qt/5.15.1/msvc2019_64/tests
|
||||
QT_INSTALL_PLUGINS:G:/Qt/5.15.1/msvc2019_64/plugins
|
||||
QT_INSTALL_IMPORTS:G:/Qt/5.15.1/msvc2019_64/imports
|
||||
QT_INSTALL_QML:G:/Qt/5.15.1/msvc2019_64/qml
|
||||
QT_INSTALL_TRANSLATIONS:G:/Qt/5.15.1/msvc2019_64/translations
|
||||
QT_INSTALL_CONFIGURATION:
|
||||
QT_INSTALL_EXAMPLES:G:/Qt/Examples/Qt-5.15.1
|
||||
QT_INSTALL_DEMOS:G:/Qt/Examples/Qt-5.15.1
|
||||
QT_HOST_PREFIX:G:/Qt/5.15.1/msvc2019_64
|
||||
QT_HOST_DATA:G:/Qt/5.15.1/msvc2019_64
|
||||
QT_HOST_BINS:G:/Qt/5.15.1/msvc2019_64/bin
|
||||
QT_HOST_LIBS:G:/Qt/5.15.1/msvc2019_64/lib
|
||||
QMAKE_SPEC:win32-msvc
|
||||
QMAKE_XSPEC:win32-msvc
|
||||
QMAKE_VERSION:3.1
|
||||
QT_VERSION:5.15.1
|
@ -0,0 +1 @@
|
||||
Info: creating stash file D:\vmprofiler-qt\src\x64\Debug\qmake\temp\.qmake.stash
|
@ -0,0 +1,2 @@
|
||||
CONFIG += no_fixpath
|
||||
QT += core gui widgets
|
@ -0,0 +1,57 @@
|
||||
<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
|
||||
<PropertyGroup>
|
||||
<Qt_DEFINES_>UNICODE;_UNICODE;WIN32;_ENABLE_EXTENDED_ALIGNED_STORAGE;WIN64;QT_WIDGETS_LIB;QT_GUI_LIB;QT_CORE_LIB</Qt_DEFINES_>
|
||||
<Qt_INCLUDEPATH_>G:\Qt\5.15.1\msvc2019_64\include;G:\Qt\5.15.1\msvc2019_64\include\QtWidgets;G:\Qt\5.15.1\msvc2019_64\include\QtGui;G:\Qt\5.15.1\msvc2019_64\include\QtANGLE;G:\Qt\5.15.1\msvc2019_64\include\QtCore;/include;G:\Qt\5.15.1\msvc2019_64\mkspecs\win32-msvc</Qt_INCLUDEPATH_>
|
||||
<Qt_LIBS_>G:\Qt\5.15.1\msvc2019_64\lib\Qt5Widgetsd.lib;G:\Qt\5.15.1\msvc2019_64\lib\Qt5Guid.lib;G:\Qt\5.15.1\msvc2019_64\lib\Qt5Cored.lib;G:\Qt\5.15.1\msvc2019_64\lib\qtmaind.lib;shell32.lib</Qt_LIBS_>
|
||||
<Qt_LIBPATH_>C:\openssl\lib;C:\Utils\my_sql\mysql-5.7.25-winx64\lib;C:\Utils\postgresql\pgsql\lib</Qt_LIBPATH_>
|
||||
<QMake_QT_SYSROOT_></QMake_QT_SYSROOT_>
|
||||
<QMake_QT_INSTALL_PREFIX_>G:/Qt/5.15.1/msvc2019_64</QMake_QT_INSTALL_PREFIX_>
|
||||
<QMake_QT_INSTALL_ARCHDATA_>G:/Qt/5.15.1/msvc2019_64</QMake_QT_INSTALL_ARCHDATA_>
|
||||
<QMake_QT_INSTALL_DATA_>G:/Qt/5.15.1/msvc2019_64</QMake_QT_INSTALL_DATA_>
|
||||
<QMake_QT_INSTALL_DOCS_>G:/Qt/Docs/Qt-5.15.1</QMake_QT_INSTALL_DOCS_>
|
||||
<QMake_QT_INSTALL_HEADERS_>G:/Qt/5.15.1/msvc2019_64/include</QMake_QT_INSTALL_HEADERS_>
|
||||
<QMake_QT_INSTALL_LIBS_>G:/Qt/5.15.1/msvc2019_64/lib</QMake_QT_INSTALL_LIBS_>
|
||||
<QMake_QT_INSTALL_LIBEXECS_>G:/Qt/5.15.1/msvc2019_64/bin</QMake_QT_INSTALL_LIBEXECS_>
|
||||
<QMake_QT_INSTALL_BINS_>G:/Qt/5.15.1/msvc2019_64/bin</QMake_QT_INSTALL_BINS_>
|
||||
<QMake_QT_INSTALL_TESTS_>G:/Qt/5.15.1/msvc2019_64/tests</QMake_QT_INSTALL_TESTS_>
|
||||
<QMake_QT_INSTALL_PLUGINS_>G:/Qt/5.15.1/msvc2019_64/plugins</QMake_QT_INSTALL_PLUGINS_>
|
||||
<QMake_QT_INSTALL_IMPORTS_>G:/Qt/5.15.1/msvc2019_64/imports</QMake_QT_INSTALL_IMPORTS_>
|
||||
<QMake_QT_INSTALL_QML_>G:/Qt/5.15.1/msvc2019_64/qml</QMake_QT_INSTALL_QML_>
|
||||
<QMake_QT_INSTALL_TRANSLATIONS_>G:/Qt/5.15.1/msvc2019_64/translations</QMake_QT_INSTALL_TRANSLATIONS_>
|
||||
<QMake_QT_INSTALL_CONFIGURATION_></QMake_QT_INSTALL_CONFIGURATION_>
|
||||
<QMake_QT_INSTALL_EXAMPLES_>G:/Qt/Examples/Qt-5.15.1</QMake_QT_INSTALL_EXAMPLES_>
|
||||
<QMake_QT_INSTALL_DEMOS_>G:/Qt/Examples/Qt-5.15.1</QMake_QT_INSTALL_DEMOS_>
|
||||
<QMake_QT_HOST_PREFIX_>G:/Qt/5.15.1/msvc2019_64</QMake_QT_HOST_PREFIX_>
|
||||
<QMake_QT_HOST_DATA_>G:/Qt/5.15.1/msvc2019_64</QMake_QT_HOST_DATA_>
|
||||
<QMake_QT_HOST_BINS_>G:/Qt/5.15.1/msvc2019_64/bin</QMake_QT_HOST_BINS_>
|
||||
<QMake_QT_HOST_LIBS_>G:/Qt/5.15.1/msvc2019_64/lib</QMake_QT_HOST_LIBS_>
|
||||
<QMake_QMAKE_SPEC_>win32-msvc</QMake_QMAKE_SPEC_>
|
||||
<QMake_QMAKE_XSPEC_>win32-msvc</QMake_QMAKE_XSPEC_>
|
||||
<QMake_QMAKE_VERSION_>3.1</QMake_QMAKE_VERSION_>
|
||||
<QMake_QT_VERSION_>5.15.1</QMake_QT_VERSION_>
|
||||
<Qt_INCLUDEPATH_
|
||||
>$(Qt_INCLUDEPATH_);x64\Debug\moc;x64\Debug\uic</Qt_INCLUDEPATH_>
|
||||
<QtBkup_QtInstall
|
||||
>5.15.1</QtBkup_QtInstall>
|
||||
<QtBkup_QtModules
|
||||
>core;gui;widgets</QtBkup_QtModules>
|
||||
<QtBkup_QtPathBinaries
|
||||
>bin</QtBkup_QtPathBinaries>
|
||||
<QtBkup_QtPathLibraryExecutables
|
||||
>bin</QtBkup_QtPathLibraryExecutables>
|
||||
<QtBkup_QtHeaderSearchPath
|
||||
></QtBkup_QtHeaderSearchPath>
|
||||
<QtBkup_QtLibrarySearchPath
|
||||
></QtBkup_QtLibrarySearchPath>
|
||||
<QtBkup_QtVars
|
||||
>DEFINES=/-D([^\s=]+(=(\x22(\\\\|\\\x22|[^\x22])*\x22|\S+))?)/$1/;INCLUDEPATH=INCPATH/-(?:iquote|isystem|idirafter|I)\s*(\x22[^\x22]+\x22|[^\s]+)/$1/;LIBS=/(?:(?:\/LIBPATH:|-L)(?:\x22[^\x22]+\x22|[^\s]+))|(\x22[^\x22]+\x22|[^\s]+)/$1/;LIBPATH=LIBS/(?:\/LIBPATH:|-L)(\x22[^\x22]+\x22|[^\s]+)/$1/</QtBkup_QtVars>
|
||||
<QtBkup_QMakeCodeLines
|
||||
></QtBkup_QMakeCodeLines>
|
||||
<QtBkup_QtBuildConfig
|
||||
>debug</QtBkup_QtBuildConfig>
|
||||
<QtVersion>5.15.1</QtVersion>
|
||||
<QtVersionMajor>5</QtVersionMajor>
|
||||
<QtVersionMinor>15</QtVersionMinor>
|
||||
<QtVersionPatch>1</QtVersionPatch>
|
||||
</PropertyGroup>
|
||||
</Project>
|
@ -0,0 +1,95 @@
|
||||
/****************************************************************************
|
||||
** Meta object code from reading C++ file 'DarkStyle.h'
|
||||
**
|
||||
** Created by: The Qt Meta Object Compiler version 67 (Qt 5.15.1)
|
||||
**
|
||||
** WARNING! All changes made in this file will be lost!
|
||||
*****************************************************************************/
|
||||
|
||||
#include <memory>
|
||||
#include "../../../DarkStyle/DarkStyle.h"
|
||||
#include <QtCore/qbytearray.h>
|
||||
#include <QtCore/qmetatype.h>
|
||||
#if !defined(Q_MOC_OUTPUT_REVISION)
|
||||
#error "The header file 'DarkStyle.h' doesn't include <QObject>."
|
||||
#elif Q_MOC_OUTPUT_REVISION != 67
|
||||
#error "This file was generated using the moc from 5.15.1. It"
|
||||
#error "cannot be used with the include files from this version of Qt."
|
||||
#error "(The moc has changed too much.)"
|
||||
#endif
|
||||
|
||||
QT_BEGIN_MOC_NAMESPACE
|
||||
QT_WARNING_PUSH
|
||||
QT_WARNING_DISABLE_DEPRECATED
|
||||
struct qt_meta_stringdata_DarkStyle_t {
|
||||
QByteArrayData data[1];
|
||||
char stringdata0[10];
|
||||
};
|
||||
#define QT_MOC_LITERAL(idx, ofs, len) \
|
||||
Q_STATIC_BYTE_ARRAY_DATA_HEADER_INITIALIZER_WITH_OFFSET(len, \
|
||||
qptrdiff(offsetof(qt_meta_stringdata_DarkStyle_t, stringdata0) + ofs \
|
||||
- idx * sizeof(QByteArrayData)) \
|
||||
)
|
||||
static const qt_meta_stringdata_DarkStyle_t qt_meta_stringdata_DarkStyle = {
|
||||
{
|
||||
QT_MOC_LITERAL(0, 0, 9) // "DarkStyle"
|
||||
|
||||
},
|
||||
"DarkStyle"
|
||||
};
|
||||
#undef QT_MOC_LITERAL
|
||||
|
||||
static const uint qt_meta_data_DarkStyle[] = {
|
||||
|
||||
// content:
|
||||
8, // revision
|
||||
0, // classname
|
||||
0, 0, // classinfo
|
||||
0, 0, // methods
|
||||
0, 0, // properties
|
||||
0, 0, // enums/sets
|
||||
0, 0, // constructors
|
||||
0, // flags
|
||||
0, // signalCount
|
||||
|
||||
0 // eod
|
||||
};
|
||||
|
||||
void DarkStyle::qt_static_metacall(QObject *_o, QMetaObject::Call _c, int _id, void **_a)
|
||||
{
|
||||
Q_UNUSED(_o);
|
||||
Q_UNUSED(_id);
|
||||
Q_UNUSED(_c);
|
||||
Q_UNUSED(_a);
|
||||
}
|
||||
|
||||
QT_INIT_METAOBJECT const QMetaObject DarkStyle::staticMetaObject = { {
|
||||
QMetaObject::SuperData::link<QProxyStyle::staticMetaObject>(),
|
||||
qt_meta_stringdata_DarkStyle.data,
|
||||
qt_meta_data_DarkStyle,
|
||||
qt_static_metacall,
|
||||
nullptr,
|
||||
nullptr
|
||||
} };
|
||||
|
||||
|
||||
const QMetaObject *DarkStyle::metaObject() const
|
||||
{
|
||||
return QObject::d_ptr->metaObject ? QObject::d_ptr->dynamicMetaObject() : &staticMetaObject;
|
||||
}
|
||||
|
||||
void *DarkStyle::qt_metacast(const char *_clname)
|
||||
{
|
||||
if (!_clname) return nullptr;
|
||||
if (!strcmp(_clname, qt_meta_stringdata_DarkStyle.stringdata0))
|
||||
return static_cast<void*>(this);
|
||||
return QProxyStyle::qt_metacast(_clname);
|
||||
}
|
||||
|
||||
int DarkStyle::qt_metacall(QMetaObject::Call _c, int _id, void **_a)
|
||||
{
|
||||
_id = QProxyStyle::qt_metacall(_c, _id, _a);
|
||||
return _id;
|
||||
}
|
||||
QT_WARNING_POP
|
||||
QT_END_MOC_NAMESPACE
|
@ -0,0 +1,129 @@
|
||||
/****************************************************************************
|
||||
** Meta object code from reading C++ file 'QVMProfiler.h'
|
||||
**
|
||||
** Created by: The Qt Meta Object Compiler version 67 (Qt 5.15.1)
|
||||
**
|
||||
** WARNING! All changes made in this file will be lost!
|
||||
*****************************************************************************/
|
||||
|
||||
#include <memory>
|
||||
#include "../../../QVMProfiler.h"
|
||||
#include <QtCore/qbytearray.h>
|
||||
#include <QtCore/qmetatype.h>
|
||||
#if !defined(Q_MOC_OUTPUT_REVISION)
|
||||
#error "The header file 'QVMProfiler.h' doesn't include <QObject>."
|
||||
#elif Q_MOC_OUTPUT_REVISION != 67
|
||||
#error "This file was generated using the moc from 5.15.1. It"
|
||||
#error "cannot be used with the include files from this version of Qt."
|
||||
#error "(The moc has changed too much.)"
|
||||
#endif
|
||||
|
||||
QT_BEGIN_MOC_NAMESPACE
|
||||
QT_WARNING_PUSH
|
||||
QT_WARNING_DISABLE_DEPRECATED
|
||||
struct qt_meta_stringdata_QVMProfiler_t {
|
||||
QByteArrayData data[5];
|
||||
char stringdata0[124];
|
||||
};
|
||||
#define QT_MOC_LITERAL(idx, ofs, len) \
|
||||
Q_STATIC_BYTE_ARRAY_DATA_HEADER_INITIALIZER_WITH_OFFSET(len, \
|
||||
qptrdiff(offsetof(qt_meta_stringdata_QVMProfiler_t, stringdata0) + ofs \
|
||||
- idx * sizeof(QByteArrayData)) \
|
||||
)
|
||||
static const qt_meta_stringdata_QVMProfiler_t qt_meta_stringdata_QVMProfiler = {
|
||||
{
|
||||
QT_MOC_LITERAL(0, 0, 11), // "QVMProfiler"
|
||||
QT_MOC_LITERAL(1, 12, 31), // "on_actionOpen_VMTrace_triggered"
|
||||
QT_MOC_LITERAL(2, 44, 0), // ""
|
||||
QT_MOC_LITERAL(3, 45, 31), // "on_actionCloseProgram_triggered"
|
||||
QT_MOC_LITERAL(4, 77, 46) // "on_VirtualInstructionTree_ite..."
|
||||
|
||||
},
|
||||
"QVMProfiler\0on_actionOpen_VMTrace_triggered\0"
|
||||
"\0on_actionCloseProgram_triggered\0"
|
||||
"on_VirtualInstructionTree_itemSelectionChanged"
|
||||
};
|
||||
#undef QT_MOC_LITERAL
|
||||
|
||||
static const uint qt_meta_data_QVMProfiler[] = {
|
||||
|
||||
// content:
|
||||
8, // revision
|
||||
0, // classname
|
||||
0, 0, // classinfo
|
||||
3, 14, // methods
|
||||
0, 0, // properties
|
||||
0, 0, // enums/sets
|
||||
0, 0, // constructors
|
||||
0, // flags
|
||||
0, // signalCount
|
||||
|
||||
// slots: name, argc, parameters, tag, flags
|
||||
1, 0, 29, 2, 0x08 /* Private */,
|
||||
3, 0, 30, 2, 0x08 /* Private */,
|
||||
4, 0, 31, 2, 0x08 /* Private */,
|
||||
|
||||
// slots: parameters
|
||||
QMetaType::Void,
|
||||
QMetaType::Void,
|
||||
QMetaType::Void,
|
||||
|
||||
0 // eod
|
||||
};
|
||||
|
||||
void QVMProfiler::qt_static_metacall(QObject *_o, QMetaObject::Call _c, int _id, void **_a)
|
||||
{
|
||||
if (_c == QMetaObject::InvokeMetaMethod) {
|
||||
auto *_t = static_cast<QVMProfiler *>(_o);
|
||||
Q_UNUSED(_t)
|
||||
switch (_id) {
|
||||
case 0: _t->on_actionOpen_VMTrace_triggered(); break;
|
||||
case 1: _t->on_actionCloseProgram_triggered(); break;
|
||||
case 2: _t->on_VirtualInstructionTree_itemSelectionChanged(); break;
|
||||
default: ;
|
||||
}
|
||||
}
|
||||
Q_UNUSED(_a);
|
||||
}
|
||||
|
||||
QT_INIT_METAOBJECT const QMetaObject QVMProfiler::staticMetaObject = { {
|
||||
QMetaObject::SuperData::link<QMainWindow::staticMetaObject>(),
|
||||
qt_meta_stringdata_QVMProfiler.data,
|
||||
qt_meta_data_QVMProfiler,
|
||||
qt_static_metacall,
|
||||
nullptr,
|
||||
nullptr
|
||||
} };
|
||||
|
||||
|
||||
const QMetaObject *QVMProfiler::metaObject() const
|
||||
{
|
||||
return QObject::d_ptr->metaObject ? QObject::d_ptr->dynamicMetaObject() : &staticMetaObject;
|
||||
}
|
||||
|
||||
void *QVMProfiler::qt_metacast(const char *_clname)
|
||||
{
|
||||
if (!_clname) return nullptr;
|
||||
if (!strcmp(_clname, qt_meta_stringdata_QVMProfiler.stringdata0))
|
||||
return static_cast<void*>(this);
|
||||
return QMainWindow::qt_metacast(_clname);
|
||||
}
|
||||
|
||||
int QVMProfiler::qt_metacall(QMetaObject::Call _c, int _id, void **_a)
|
||||
{
|
||||
_id = QMainWindow::qt_metacall(_c, _id, _a);
|
||||
if (_id < 0)
|
||||
return _id;
|
||||
if (_c == QMetaObject::InvokeMetaMethod) {
|
||||
if (_id < 3)
|
||||
qt_static_metacall(this, _c, _id, _a);
|
||||
_id -= 3;
|
||||
} else if (_c == QMetaObject::RegisterMethodArgumentMetaType) {
|
||||
if (_id < 3)
|
||||
*reinterpret_cast<int*>(_a[0]) = -1;
|
||||
_id -= 3;
|
||||
}
|
||||
return _id;
|
||||
}
|
||||
QT_WARNING_POP
|
||||
QT_END_MOC_NAMESPACE
|
@ -0,0 +1,157 @@
|
||||
/****************************************************************************
|
||||
** Meta object code from reading C++ file 'framelesswindow.h'
|
||||
**
|
||||
** Created by: The Qt Meta Object Compiler version 67 (Qt 5.15.1)
|
||||
**
|
||||
** WARNING! All changes made in this file will be lost!
|
||||
*****************************************************************************/
|
||||
|
||||
#include <memory>
|
||||
#include "../../../DarkStyle/framelesswindow/framelesswindow.h"
|
||||
#include <QtCore/qbytearray.h>
|
||||
#include <QtCore/qmetatype.h>
|
||||
#if !defined(Q_MOC_OUTPUT_REVISION)
|
||||
#error "The header file 'framelesswindow.h' doesn't include <QObject>."
|
||||
#elif Q_MOC_OUTPUT_REVISION != 67
|
||||
#error "This file was generated using the moc from 5.15.1. It"
|
||||
#error "cannot be used with the include files from this version of Qt."
|
||||
#error "(The moc has changed too much.)"
|
||||
#endif
|
||||
|
||||
QT_BEGIN_MOC_NAMESPACE
|
||||
QT_WARNING_PUSH
|
||||
QT_WARNING_DISABLE_DEPRECATED
|
||||
struct qt_meta_stringdata_FramelessWindow_t {
|
||||
QByteArrayData data[14];
|
||||
char stringdata0[241];
|
||||
};
|
||||
#define QT_MOC_LITERAL(idx, ofs, len) \
|
||||
Q_STATIC_BYTE_ARRAY_DATA_HEADER_INITIALIZER_WITH_OFFSET(len, \
|
||||
qptrdiff(offsetof(qt_meta_stringdata_FramelessWindow_t, stringdata0) + ofs \
|
||||
- idx * sizeof(QByteArrayData)) \
|
||||
)
|
||||
static const qt_meta_stringdata_FramelessWindow_t qt_meta_stringdata_FramelessWindow = {
|
||||
{
|
||||
QT_MOC_LITERAL(0, 0, 15), // "FramelessWindow"
|
||||
QT_MOC_LITERAL(1, 16, 14), // "setWindowTitle"
|
||||
QT_MOC_LITERAL(2, 31, 0), // ""
|
||||
QT_MOC_LITERAL(3, 32, 4), // "text"
|
||||
QT_MOC_LITERAL(4, 37, 13), // "setWindowIcon"
|
||||
QT_MOC_LITERAL(5, 51, 3), // "ico"
|
||||
QT_MOC_LITERAL(6, 55, 26), // "on_applicationStateChanged"
|
||||
QT_MOC_LITERAL(7, 82, 20), // "Qt::ApplicationState"
|
||||
QT_MOC_LITERAL(8, 103, 5), // "state"
|
||||
QT_MOC_LITERAL(9, 109, 25), // "on_minimizeButton_clicked"
|
||||
QT_MOC_LITERAL(10, 135, 24), // "on_restoreButton_clicked"
|
||||
QT_MOC_LITERAL(11, 160, 25), // "on_maximizeButton_clicked"
|
||||
QT_MOC_LITERAL(12, 186, 22), // "on_closeButton_clicked"
|
||||
QT_MOC_LITERAL(13, 209, 31) // "on_windowTitlebar_doubleClicked"
|
||||
|
||||
},
|
||||
"FramelessWindow\0setWindowTitle\0\0text\0"
|
||||
"setWindowIcon\0ico\0on_applicationStateChanged\0"
|
||||
"Qt::ApplicationState\0state\0"
|
||||
"on_minimizeButton_clicked\0"
|
||||
"on_restoreButton_clicked\0"
|
||||
"on_maximizeButton_clicked\0"
|
||||
"on_closeButton_clicked\0"
|
||||
"on_windowTitlebar_doubleClicked"
|
||||
};
|
||||
#undef QT_MOC_LITERAL
|
||||
|
||||
static const uint qt_meta_data_FramelessWindow[] = {
|
||||
|
||||
// content:
|
||||
8, // revision
|
||||
0, // classname
|
||||
0, 0, // classinfo
|
||||
8, 14, // methods
|
||||
0, 0, // properties
|
||||
0, 0, // enums/sets
|
||||
0, 0, // constructors
|
||||
0, // flags
|
||||
0, // signalCount
|
||||
|
||||
// slots: name, argc, parameters, tag, flags
|
||||
1, 1, 54, 2, 0x0a /* Public */,
|
||||
4, 1, 57, 2, 0x0a /* Public */,
|
||||
6, 1, 60, 2, 0x08 /* Private */,
|
||||
9, 0, 63, 2, 0x08 /* Private */,
|
||||
10, 0, 64, 2, 0x08 /* Private */,
|
||||
11, 0, 65, 2, 0x08 /* Private */,
|
||||
12, 0, 66, 2, 0x08 /* Private */,
|
||||
13, 0, 67, 2, 0x08 /* Private */,
|
||||
|
||||
// slots: parameters
|
||||
QMetaType::Void, QMetaType::QString, 3,
|
||||
QMetaType::Void, QMetaType::QIcon, 5,
|
||||
QMetaType::Void, 0x80000000 | 7, 8,
|
||||
QMetaType::Void,
|
||||
QMetaType::Void,
|
||||
QMetaType::Void,
|
||||
QMetaType::Void,
|
||||
QMetaType::Void,
|
||||
|
||||
0 // eod
|
||||
};
|
||||
|
||||
void FramelessWindow::qt_static_metacall(QObject *_o, QMetaObject::Call _c, int _id, void **_a)
|
||||
{
|
||||
if (_c == QMetaObject::InvokeMetaMethod) {
|
||||
auto *_t = static_cast<FramelessWindow *>(_o);
|
||||
Q_UNUSED(_t)
|
||||
switch (_id) {
|
||||
case 0: _t->setWindowTitle((*reinterpret_cast< const QString(*)>(_a[1]))); break;
|
||||
case 1: _t->setWindowIcon((*reinterpret_cast< const QIcon(*)>(_a[1]))); break;
|
||||
case 2: _t->on_applicationStateChanged((*reinterpret_cast< Qt::ApplicationState(*)>(_a[1]))); break;
|
||||
case 3: _t->on_minimizeButton_clicked(); break;
|
||||
case 4: _t->on_restoreButton_clicked(); break;
|
||||
case 5: _t->on_maximizeButton_clicked(); break;
|
||||
case 6: _t->on_closeButton_clicked(); break;
|
||||
case 7: _t->on_windowTitlebar_doubleClicked(); break;
|
||||
default: ;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
QT_INIT_METAOBJECT const QMetaObject FramelessWindow::staticMetaObject = { {
|
||||
QMetaObject::SuperData::link<QWidget::staticMetaObject>(),
|
||||
qt_meta_stringdata_FramelessWindow.data,
|
||||
qt_meta_data_FramelessWindow,
|
||||
qt_static_metacall,
|
||||
nullptr,
|
||||
nullptr
|
||||
} };
|
||||
|
||||
|
||||
const QMetaObject *FramelessWindow::metaObject() const
|
||||
{
|
||||
return QObject::d_ptr->metaObject ? QObject::d_ptr->dynamicMetaObject() : &staticMetaObject;
|
||||
}
|
||||
|
||||
void *FramelessWindow::qt_metacast(const char *_clname)
|
||||
{
|
||||
if (!_clname) return nullptr;
|
||||
if (!strcmp(_clname, qt_meta_stringdata_FramelessWindow.stringdata0))
|
||||
return static_cast<void*>(this);
|
||||
return QWidget::qt_metacast(_clname);
|
||||
}
|
||||
|
||||
int FramelessWindow::qt_metacall(QMetaObject::Call _c, int _id, void **_a)
|
||||
{
|
||||
_id = QWidget::qt_metacall(_c, _id, _a);
|
||||
if (_id < 0)
|
||||
return _id;
|
||||
if (_c == QMetaObject::InvokeMetaMethod) {
|
||||
if (_id < 8)
|
||||
qt_static_metacall(this, _c, _id, _a);
|
||||
_id -= 8;
|
||||
} else if (_c == QMetaObject::RegisterMethodArgumentMetaType) {
|
||||
if (_id < 8)
|
||||
*reinterpret_cast<int*>(_a[0]) = -1;
|
||||
_id -= 8;
|
||||
}
|
||||
return _id;
|
||||
}
|
||||
QT_WARNING_POP
|
||||
QT_END_MOC_NAMESPACE
|
@ -0,0 +1,134 @@
|
||||
/****************************************************************************
|
||||
** Meta object code from reading C++ file 'windowdragger.h'
|
||||
**
|
||||
** Created by: The Qt Meta Object Compiler version 67 (Qt 5.15.1)
|
||||
**
|
||||
** WARNING! All changes made in this file will be lost!
|
||||
*****************************************************************************/
|
||||
|
||||
#include <memory>
|
||||
#include "../../../DarkStyle/framelesswindow/windowdragger.h"
|
||||
#include <QtCore/qbytearray.h>
|
||||
#include <QtCore/qmetatype.h>
|
||||
#if !defined(Q_MOC_OUTPUT_REVISION)
|
||||
#error "The header file 'windowdragger.h' doesn't include <QObject>."
|
||||
#elif Q_MOC_OUTPUT_REVISION != 67
|
||||
#error "This file was generated using the moc from 5.15.1. It"
|
||||
#error "cannot be used with the include files from this version of Qt."
|
||||
#error "(The moc has changed too much.)"
|
||||
#endif
|
||||
|
||||
QT_BEGIN_MOC_NAMESPACE
|
||||
QT_WARNING_PUSH
|
||||
QT_WARNING_DISABLE_DEPRECATED
|
||||
struct qt_meta_stringdata_WindowDragger_t {
|
||||
QByteArrayData data[3];
|
||||
char stringdata0[29];
|
||||
};
|
||||
#define QT_MOC_LITERAL(idx, ofs, len) \
|
||||
Q_STATIC_BYTE_ARRAY_DATA_HEADER_INITIALIZER_WITH_OFFSET(len, \
|
||||
qptrdiff(offsetof(qt_meta_stringdata_WindowDragger_t, stringdata0) + ofs \
|
||||
- idx * sizeof(QByteArrayData)) \
|
||||
)
|
||||
static const qt_meta_stringdata_WindowDragger_t qt_meta_stringdata_WindowDragger = {
|
||||
{
|
||||
QT_MOC_LITERAL(0, 0, 13), // "WindowDragger"
|
||||
QT_MOC_LITERAL(1, 14, 13), // "doubleClicked"
|
||||
QT_MOC_LITERAL(2, 28, 0) // ""
|
||||
|
||||
},
|
||||
"WindowDragger\0doubleClicked\0"
|
||||
};
|
||||
#undef QT_MOC_LITERAL
|
||||
|
||||
static const uint qt_meta_data_WindowDragger[] = {
|
||||
|
||||
// content:
|
||||
8, // revision
|
||||
0, // classname
|
||||
0, 0, // classinfo
|
||||
1, 14, // methods
|
||||
0, 0, // properties
|
||||
0, 0, // enums/sets
|
||||
0, 0, // constructors
|
||||
0, // flags
|
||||
1, // signalCount
|
||||
|
||||
// signals: name, argc, parameters, tag, flags
|
||||
1, 0, 19, 2, 0x06 /* Public */,
|
||||
|
||||
// signals: parameters
|
||||
QMetaType::Void,
|
||||
|
||||
0 // eod
|
||||
};
|
||||
|
||||
void WindowDragger::qt_static_metacall(QObject *_o, QMetaObject::Call _c, int _id, void **_a)
|
||||
{
|
||||
if (_c == QMetaObject::InvokeMetaMethod) {
|
||||
auto *_t = static_cast<WindowDragger *>(_o);
|
||||
Q_UNUSED(_t)
|
||||
switch (_id) {
|
||||
case 0: _t->doubleClicked(); break;
|
||||
default: ;
|
||||
}
|
||||
} else if (_c == QMetaObject::IndexOfMethod) {
|
||||
int *result = reinterpret_cast<int *>(_a[0]);
|
||||
{
|
||||
using _t = void (WindowDragger::*)();
|
||||
if (*reinterpret_cast<_t *>(_a[1]) == static_cast<_t>(&WindowDragger::doubleClicked)) {
|
||||
*result = 0;
|
||||
return;
|
||||
}
|
||||
}
|
||||
}
|
||||
Q_UNUSED(_a);
|
||||
}
|
||||
|
||||
QT_INIT_METAOBJECT const QMetaObject WindowDragger::staticMetaObject = { {
|
||||
QMetaObject::SuperData::link<QWidget::staticMetaObject>(),
|
||||
qt_meta_stringdata_WindowDragger.data,
|
||||
qt_meta_data_WindowDragger,
|
||||
qt_static_metacall,
|
||||
nullptr,
|
||||
nullptr
|
||||
} };
|
||||
|
||||
|
||||
const QMetaObject *WindowDragger::metaObject() const
|
||||
{
|
||||
return QObject::d_ptr->metaObject ? QObject::d_ptr->dynamicMetaObject() : &staticMetaObject;
|
||||
}
|
||||
|
||||
void *WindowDragger::qt_metacast(const char *_clname)
|
||||
{
|
||||
if (!_clname) return nullptr;
|
||||
if (!strcmp(_clname, qt_meta_stringdata_WindowDragger.stringdata0))
|
||||
return static_cast<void*>(this);
|
||||
return QWidget::qt_metacast(_clname);
|
||||
}
|
||||
|
||||
int WindowDragger::qt_metacall(QMetaObject::Call _c, int _id, void **_a)
|
||||
{
|
||||
_id = QWidget::qt_metacall(_c, _id, _a);
|
||||
if (_id < 0)
|
||||
return _id;
|
||||
if (_c == QMetaObject::InvokeMetaMethod) {
|
||||
if (_id < 1)
|
||||
qt_static_metacall(this, _c, _id, _a);
|
||||
_id -= 1;
|
||||
} else if (_c == QMetaObject::RegisterMethodArgumentMetaType) {
|
||||
if (_id < 1)
|
||||
*reinterpret_cast<int*>(_a[0]) = -1;
|
||||
_id -= 1;
|
||||
}
|
||||
return _id;
|
||||
}
|
||||
|
||||
// SIGNAL 0
|
||||
void WindowDragger::doubleClicked()
|
||||
{
|
||||
QMetaObject::activate(this, &staticMetaObject, 0, nullptr);
|
||||
}
|
||||
QT_WARNING_POP
|
||||
QT_END_MOC_NAMESPACE
|
@ -0,0 +1,57 @@
|
||||
<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
|
||||
<PropertyGroup>
|
||||
<Qt_DEFINES_>UNICODE;_UNICODE;WIN32;_ENABLE_EXTENDED_ALIGNED_STORAGE;WIN64;NDEBUG;QT_NO_DEBUG;QT_WIDGETS_LIB;QT_GUI_LIB;QT_CORE_LIB</Qt_DEFINES_>
|
||||
<Qt_INCLUDEPATH_>G:\Qt\5.15.1\msvc2019_64\include;G:\Qt\5.15.1\msvc2019_64\include\QtWidgets;G:\Qt\5.15.1\msvc2019_64\include\QtGui;G:\Qt\5.15.1\msvc2019_64\include\QtANGLE;G:\Qt\5.15.1\msvc2019_64\include\QtCore;/include;G:\Qt\5.15.1\msvc2019_64\mkspecs\win32-msvc</Qt_INCLUDEPATH_>
|
||||
<Qt_LIBS_>G:\Qt\5.15.1\msvc2019_64\lib\Qt5Widgets.lib;G:\Qt\5.15.1\msvc2019_64\lib\Qt5Gui.lib;G:\Qt\5.15.1\msvc2019_64\lib\Qt5Core.lib;G:\Qt\5.15.1\msvc2019_64\lib\qtmain.lib;shell32.lib</Qt_LIBS_>
|
||||
<Qt_LIBPATH_>C:\openssl\lib;C:\Utils\my_sql\mysql-5.7.25-winx64\lib;C:\Utils\postgresql\pgsql\lib</Qt_LIBPATH_>
|
||||
<QMake_QT_SYSROOT_></QMake_QT_SYSROOT_>
|
||||
<QMake_QT_INSTALL_PREFIX_>G:/Qt/5.15.1/msvc2019_64</QMake_QT_INSTALL_PREFIX_>
|
||||
<QMake_QT_INSTALL_ARCHDATA_>G:/Qt/5.15.1/msvc2019_64</QMake_QT_INSTALL_ARCHDATA_>
|
||||
<QMake_QT_INSTALL_DATA_>G:/Qt/5.15.1/msvc2019_64</QMake_QT_INSTALL_DATA_>
|
||||
<QMake_QT_INSTALL_DOCS_>G:/Qt/Docs/Qt-5.15.1</QMake_QT_INSTALL_DOCS_>
|
||||
<QMake_QT_INSTALL_HEADERS_>G:/Qt/5.15.1/msvc2019_64/include</QMake_QT_INSTALL_HEADERS_>
|
||||
<QMake_QT_INSTALL_LIBS_>G:/Qt/5.15.1/msvc2019_64/lib</QMake_QT_INSTALL_LIBS_>
|
||||
<QMake_QT_INSTALL_LIBEXECS_>G:/Qt/5.15.1/msvc2019_64/bin</QMake_QT_INSTALL_LIBEXECS_>
|
||||
<QMake_QT_INSTALL_BINS_>G:/Qt/5.15.1/msvc2019_64/bin</QMake_QT_INSTALL_BINS_>
|
||||
<QMake_QT_INSTALL_TESTS_>G:/Qt/5.15.1/msvc2019_64/tests</QMake_QT_INSTALL_TESTS_>
|
||||
<QMake_QT_INSTALL_PLUGINS_>G:/Qt/5.15.1/msvc2019_64/plugins</QMake_QT_INSTALL_PLUGINS_>
|
||||
<QMake_QT_INSTALL_IMPORTS_>G:/Qt/5.15.1/msvc2019_64/imports</QMake_QT_INSTALL_IMPORTS_>
|
||||
<QMake_QT_INSTALL_QML_>G:/Qt/5.15.1/msvc2019_64/qml</QMake_QT_INSTALL_QML_>
|
||||
<QMake_QT_INSTALL_TRANSLATIONS_>G:/Qt/5.15.1/msvc2019_64/translations</QMake_QT_INSTALL_TRANSLATIONS_>
|
||||
<QMake_QT_INSTALL_CONFIGURATION_></QMake_QT_INSTALL_CONFIGURATION_>
|
||||
<QMake_QT_INSTALL_EXAMPLES_>G:/Qt/Examples/Qt-5.15.1</QMake_QT_INSTALL_EXAMPLES_>
|
||||
<QMake_QT_INSTALL_DEMOS_>G:/Qt/Examples/Qt-5.15.1</QMake_QT_INSTALL_DEMOS_>
|
||||
<QMake_QT_HOST_PREFIX_>G:/Qt/5.15.1/msvc2019_64</QMake_QT_HOST_PREFIX_>
|
||||
<QMake_QT_HOST_DATA_>G:/Qt/5.15.1/msvc2019_64</QMake_QT_HOST_DATA_>
|
||||
<QMake_QT_HOST_BINS_>G:/Qt/5.15.1/msvc2019_64/bin</QMake_QT_HOST_BINS_>
|
||||
<QMake_QT_HOST_LIBS_>G:/Qt/5.15.1/msvc2019_64/lib</QMake_QT_HOST_LIBS_>
|
||||
<QMake_QMAKE_SPEC_>win32-msvc</QMake_QMAKE_SPEC_>
|
||||
<QMake_QMAKE_XSPEC_>win32-msvc</QMake_QMAKE_XSPEC_>
|
||||
<QMake_QMAKE_VERSION_>3.1</QMake_QMAKE_VERSION_>
|
||||
<QMake_QT_VERSION_>5.15.1</QMake_QT_VERSION_>
|
||||
<Qt_INCLUDEPATH_
|
||||
>$(Qt_INCLUDEPATH_);x64\Release\moc;x64\Release\uic</Qt_INCLUDEPATH_>
|
||||
<QtBkup_QtInstall
|
||||
>5.15.1</QtBkup_QtInstall>
|
||||
<QtBkup_QtModules
|
||||
>core;gui;widgets</QtBkup_QtModules>
|
||||
<QtBkup_QtPathBinaries
|
||||
>bin</QtBkup_QtPathBinaries>
|
||||
<QtBkup_QtPathLibraryExecutables
|
||||
>bin</QtBkup_QtPathLibraryExecutables>
|
||||
<QtBkup_QtHeaderSearchPath
|
||||
></QtBkup_QtHeaderSearchPath>
|
||||
<QtBkup_QtLibrarySearchPath
|
||||
></QtBkup_QtLibrarySearchPath>
|
||||
<QtBkup_QtVars
|
||||
>DEFINES=/-D([^\s=]+(=(\x22(\\\\|\\\x22|[^\x22])*\x22|\S+))?)/$1/;INCLUDEPATH=INCPATH/-(?:iquote|isystem|idirafter|I)\s*(\x22[^\x22]+\x22|[^\s]+)/$1/;LIBS=/(?:(?:\/LIBPATH:|-L)(?:\x22[^\x22]+\x22|[^\s]+))|(\x22[^\x22]+\x22|[^\s]+)/$1/;LIBPATH=LIBS/(?:\/LIBPATH:|-L)(\x22[^\x22]+\x22|[^\s]+)/$1/</QtBkup_QtVars>
|
||||
<QtBkup_QMakeCodeLines
|
||||
></QtBkup_QMakeCodeLines>
|
||||
<QtBkup_QtBuildConfig
|
||||
>release</QtBkup_QtBuildConfig>
|
||||
<QtVersion>5.15.1</QtVersion>
|
||||
<QtVersionMajor>5</QtVersionMajor>
|
||||
<QtVersionMinor>15</QtVersionMinor>
|
||||
<QtVersionPatch>1</QtVersionPatch>
|
||||
</PropertyGroup>
|
||||
</Project>
|
@ -0,0 +1,7 @@
|
||||
QMAKE_CXX.QT_COMPILER_STDCXX = 199711L
|
||||
QMAKE_CXX.QMAKE_MSC_VER = 1928
|
||||
QMAKE_CXX.QMAKE_MSC_FULL_VER = 192829336
|
||||
QMAKE_CXX.COMPILER_MACROS = \
|
||||
QT_COMPILER_STDCXX \
|
||||
QMAKE_MSC_VER \
|
||||
QMAKE_MSC_FULL_VER
|
@ -0,0 +1 @@
|
||||
C:\Users\_xeroxz\AppData\Local\Temp\044ojbft.3tm.designtime.props
|
@ -0,0 +1,25 @@
|
||||
QT_SYSROOT:
|
||||
QT_INSTALL_PREFIX:G:/Qt/5.15.1/msvc2019_64
|
||||
QT_INSTALL_ARCHDATA:G:/Qt/5.15.1/msvc2019_64
|
||||
QT_INSTALL_DATA:G:/Qt/5.15.1/msvc2019_64
|
||||
QT_INSTALL_DOCS:G:/Qt/Docs/Qt-5.15.1
|
||||
QT_INSTALL_HEADERS:G:/Qt/5.15.1/msvc2019_64/include
|
||||
QT_INSTALL_LIBS:G:/Qt/5.15.1/msvc2019_64/lib
|
||||
QT_INSTALL_LIBEXECS:G:/Qt/5.15.1/msvc2019_64/bin
|
||||
QT_INSTALL_BINS:G:/Qt/5.15.1/msvc2019_64/bin
|
||||
QT_INSTALL_TESTS:G:/Qt/5.15.1/msvc2019_64/tests
|
||||
QT_INSTALL_PLUGINS:G:/Qt/5.15.1/msvc2019_64/plugins
|
||||
QT_INSTALL_IMPORTS:G:/Qt/5.15.1/msvc2019_64/imports
|
||||
QT_INSTALL_QML:G:/Qt/5.15.1/msvc2019_64/qml
|
||||
QT_INSTALL_TRANSLATIONS:G:/Qt/5.15.1/msvc2019_64/translations
|
||||
QT_INSTALL_CONFIGURATION:
|
||||
QT_INSTALL_EXAMPLES:G:/Qt/Examples/Qt-5.15.1
|
||||
QT_INSTALL_DEMOS:G:/Qt/Examples/Qt-5.15.1
|
||||
QT_HOST_PREFIX:G:/Qt/5.15.1/msvc2019_64
|
||||
QT_HOST_DATA:G:/Qt/5.15.1/msvc2019_64
|
||||
QT_HOST_BINS:G:/Qt/5.15.1/msvc2019_64/bin
|
||||
QT_HOST_LIBS:G:/Qt/5.15.1/msvc2019_64/lib
|
||||
QMAKE_SPEC:win32-msvc
|
||||
QMAKE_XSPEC:win32-msvc
|
||||
QMAKE_VERSION:3.1
|
||||
QT_VERSION:5.15.1
|
@ -0,0 +1 @@
|
||||
Info: creating stash file D:\vmprofiler-qt\src\x64\Release\qmake\temp\.qmake.stash
|
@ -0,0 +1,2 @@
|
||||
CONFIG += no_fixpath
|
||||
QT += core gui widgets
|
@ -0,0 +1,57 @@
|
||||
<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
|
||||
<PropertyGroup>
|
||||
<Qt_DEFINES_>UNICODE;_UNICODE;WIN32;_ENABLE_EXTENDED_ALIGNED_STORAGE;WIN64;NDEBUG;QT_NO_DEBUG;QT_WIDGETS_LIB;QT_GUI_LIB;QT_CORE_LIB</Qt_DEFINES_>
|
||||
<Qt_INCLUDEPATH_>G:\Qt\5.15.1\msvc2019_64\include;G:\Qt\5.15.1\msvc2019_64\include\QtWidgets;G:\Qt\5.15.1\msvc2019_64\include\QtGui;G:\Qt\5.15.1\msvc2019_64\include\QtANGLE;G:\Qt\5.15.1\msvc2019_64\include\QtCore;/include;G:\Qt\5.15.1\msvc2019_64\mkspecs\win32-msvc</Qt_INCLUDEPATH_>
|
||||
<Qt_LIBS_>G:\Qt\5.15.1\msvc2019_64\lib\Qt5Widgets.lib;G:\Qt\5.15.1\msvc2019_64\lib\Qt5Gui.lib;G:\Qt\5.15.1\msvc2019_64\lib\Qt5Core.lib;G:\Qt\5.15.1\msvc2019_64\lib\qtmain.lib;shell32.lib</Qt_LIBS_>
|
||||
<Qt_LIBPATH_>C:\openssl\lib;C:\Utils\my_sql\mysql-5.7.25-winx64\lib;C:\Utils\postgresql\pgsql\lib</Qt_LIBPATH_>
|
||||
<QMake_QT_SYSROOT_></QMake_QT_SYSROOT_>
|
||||
<QMake_QT_INSTALL_PREFIX_>G:/Qt/5.15.1/msvc2019_64</QMake_QT_INSTALL_PREFIX_>
|
||||
<QMake_QT_INSTALL_ARCHDATA_>G:/Qt/5.15.1/msvc2019_64</QMake_QT_INSTALL_ARCHDATA_>
|
||||
<QMake_QT_INSTALL_DATA_>G:/Qt/5.15.1/msvc2019_64</QMake_QT_INSTALL_DATA_>
|
||||
<QMake_QT_INSTALL_DOCS_>G:/Qt/Docs/Qt-5.15.1</QMake_QT_INSTALL_DOCS_>
|
||||
<QMake_QT_INSTALL_HEADERS_>G:/Qt/5.15.1/msvc2019_64/include</QMake_QT_INSTALL_HEADERS_>
|
||||
<QMake_QT_INSTALL_LIBS_>G:/Qt/5.15.1/msvc2019_64/lib</QMake_QT_INSTALL_LIBS_>
|
||||
<QMake_QT_INSTALL_LIBEXECS_>G:/Qt/5.15.1/msvc2019_64/bin</QMake_QT_INSTALL_LIBEXECS_>
|
||||
<QMake_QT_INSTALL_BINS_>G:/Qt/5.15.1/msvc2019_64/bin</QMake_QT_INSTALL_BINS_>
|
||||
<QMake_QT_INSTALL_TESTS_>G:/Qt/5.15.1/msvc2019_64/tests</QMake_QT_INSTALL_TESTS_>
|
||||
<QMake_QT_INSTALL_PLUGINS_>G:/Qt/5.15.1/msvc2019_64/plugins</QMake_QT_INSTALL_PLUGINS_>
|
||||
<QMake_QT_INSTALL_IMPORTS_>G:/Qt/5.15.1/msvc2019_64/imports</QMake_QT_INSTALL_IMPORTS_>
|
||||
<QMake_QT_INSTALL_QML_>G:/Qt/5.15.1/msvc2019_64/qml</QMake_QT_INSTALL_QML_>
|
||||
<QMake_QT_INSTALL_TRANSLATIONS_>G:/Qt/5.15.1/msvc2019_64/translations</QMake_QT_INSTALL_TRANSLATIONS_>
|
||||
<QMake_QT_INSTALL_CONFIGURATION_></QMake_QT_INSTALL_CONFIGURATION_>
|
||||
<QMake_QT_INSTALL_EXAMPLES_>G:/Qt/Examples/Qt-5.15.1</QMake_QT_INSTALL_EXAMPLES_>
|
||||
<QMake_QT_INSTALL_DEMOS_>G:/Qt/Examples/Qt-5.15.1</QMake_QT_INSTALL_DEMOS_>
|
||||
<QMake_QT_HOST_PREFIX_>G:/Qt/5.15.1/msvc2019_64</QMake_QT_HOST_PREFIX_>
|
||||
<QMake_QT_HOST_DATA_>G:/Qt/5.15.1/msvc2019_64</QMake_QT_HOST_DATA_>
|
||||
<QMake_QT_HOST_BINS_>G:/Qt/5.15.1/msvc2019_64/bin</QMake_QT_HOST_BINS_>
|
||||
<QMake_QT_HOST_LIBS_>G:/Qt/5.15.1/msvc2019_64/lib</QMake_QT_HOST_LIBS_>
|
||||
<QMake_QMAKE_SPEC_>win32-msvc</QMake_QMAKE_SPEC_>
|
||||
<QMake_QMAKE_XSPEC_>win32-msvc</QMake_QMAKE_XSPEC_>
|
||||
<QMake_QMAKE_VERSION_>3.1</QMake_QMAKE_VERSION_>
|
||||
<QMake_QT_VERSION_>5.15.1</QMake_QT_VERSION_>
|
||||
<Qt_INCLUDEPATH_
|
||||
>$(Qt_INCLUDEPATH_);x64\Release\moc;x64\Release\uic</Qt_INCLUDEPATH_>
|
||||
<QtBkup_QtInstall
|
||||
>5.15.1</QtBkup_QtInstall>
|
||||
<QtBkup_QtModules
|
||||
>core;gui;widgets</QtBkup_QtModules>
|
||||
<QtBkup_QtPathBinaries
|
||||
>bin</QtBkup_QtPathBinaries>
|
||||
<QtBkup_QtPathLibraryExecutables
|
||||
>bin</QtBkup_QtPathLibraryExecutables>
|
||||
<QtBkup_QtHeaderSearchPath
|
||||
></QtBkup_QtHeaderSearchPath>
|
||||
<QtBkup_QtLibrarySearchPath
|
||||
></QtBkup_QtLibrarySearchPath>
|
||||
<QtBkup_QtVars
|
||||
>DEFINES=/-D([^\s=]+(=(\x22(\\\\|\\\x22|[^\x22])*\x22|\S+))?)/$1/;INCLUDEPATH=INCPATH/-(?:iquote|isystem|idirafter|I)\s*(\x22[^\x22]+\x22|[^\s]+)/$1/;LIBS=/(?:(?:\/LIBPATH:|-L)(?:\x22[^\x22]+\x22|[^\s]+))|(\x22[^\x22]+\x22|[^\s]+)/$1/;LIBPATH=LIBS/(?:\/LIBPATH:|-L)(\x22[^\x22]+\x22|[^\s]+)/$1/</QtBkup_QtVars>
|
||||
<QtBkup_QMakeCodeLines
|
||||
></QtBkup_QMakeCodeLines>
|
||||
<QtBkup_QtBuildConfig
|
||||
>release</QtBkup_QtBuildConfig>
|
||||
<QtVersion>5.15.1</QtVersion>
|
||||
<QtVersionMajor>5</QtVersionMajor>
|
||||
<QtVersionMinor>15</QtVersionMinor>
|
||||
<QtVersionPatch>1</QtVersionPatch>
|
||||
</PropertyGroup>
|
||||
</Project>
|