Add a example project.
Signed-off-by: Yuhang Zhao <2546789017@qq.com>
|
@ -8,6 +8,8 @@ If you are using part of or all of the code from this repository in your own pro
|
|||
|
||||

|
||||
|
||||

|
||||
|
||||

|
||||
|
||||

|
||||
|
|
|
@ -0,0 +1,46 @@
|
|||
cmake_minimum_required(VERSION 3.15)
|
||||
|
||||
project(QQPlayer LANGUAGES CXX)
|
||||
|
||||
set(CMAKE_INCLUDE_CURRENT_DIR ON)
|
||||
|
||||
set(CMAKE_AUTOUIC ON)
|
||||
set(CMAKE_AUTOMOC ON)
|
||||
set(CMAKE_AUTORCC ON)
|
||||
|
||||
set(CMAKE_CXX_STANDARD 17)
|
||||
set(CMAKE_CXX_STANDARD_REQUIRED ON)
|
||||
set(CMAKE_CXX_EXTENSIONS OFF)
|
||||
|
||||
if(WIN32)
|
||||
set(CMAKE_DEBUG_POSTFIX "d")
|
||||
else()
|
||||
set(CMAKE_DEBUG_POSTFIX "_debug")
|
||||
endif()
|
||||
|
||||
find_package(Qt5 COMPONENTS Core Quick QuickCompiler REQUIRED)
|
||||
|
||||
set(source_files images.qrc main.cpp ../../framelessquickhelper.h ../../framelessquickhelper.cpp)
|
||||
|
||||
if(WIN32)
|
||||
enable_language(RC)
|
||||
list(APPEND source_files QQPlayer.exe.manifest QQPlayer.rc ../../winnativeeventfilter.h ../../winnativeeventfilter.cpp)
|
||||
else()
|
||||
list(APPEND source_files ../../framelesshelper.h ../../framelesshelper.cpp)
|
||||
endif()
|
||||
|
||||
if(CMAKE_BUILD_TYPE STREQUAL "Debug")
|
||||
list(APPEND source_files qml.qrc)
|
||||
else()
|
||||
set(qml_files "")
|
||||
qtquick_compiler_add_resources(qml_files qml.qrc)
|
||||
list(APPEND source_files ${qml_files})
|
||||
endif()
|
||||
|
||||
add_executable(QQPlayer ${source_files})
|
||||
|
||||
if(MSVC)
|
||||
target_compile_options(QQPlayer PRIVATE -utf-8)
|
||||
endif()
|
||||
target_compile_definitions(QQPlayer PRIVATE $<$<OR:$<CONFIG:Debug>,$<CONFIG:RelWithDebInfo>>:QT_QML_DEBUG>)
|
||||
target_link_libraries(QQPlayer PRIVATE Qt::Core Qt::Quick Qt::GuiPrivate)
|
|
@ -0,0 +1,34 @@
|
|||
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
|
||||
<assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0">
|
||||
<assemblyIdentity type="win32" name="com.wangwenx190.demo.qqplayer" version="1.0.0.0"/>
|
||||
<dependency>
|
||||
<dependentAssembly>
|
||||
<assemblyIdentity type="win32" name="Microsoft.Windows.Common-Controls" version="6.0.0.0" processorArchitecture="*" publicKeyToken="6595b64144ccf1df" language="*"/>
|
||||
</dependentAssembly>
|
||||
</dependency>
|
||||
<trustInfo xmlns="urn:schemas-microsoft-com:asm.v3">
|
||||
<security>
|
||||
<requestedPrivileges>
|
||||
<requestedExecutionLevel level="asInvoker" uiAccess="false"/>
|
||||
</requestedPrivileges>
|
||||
</security>
|
||||
</trustInfo>
|
||||
<compatibility xmlns="urn:schemas-microsoft-com:compatibility.v1">
|
||||
<application>
|
||||
<!-- Windows 7 and Windows Server 2008 R2 -->
|
||||
<supportedOS Id="{35138b9a-5d96-4fbd-8e2d-a2440225f93a}"/>
|
||||
<!-- Windows 8 and Windows Server 2012 -->
|
||||
<supportedOS Id="{4a2f28e3-53b9-4441-ba9c-d69d4a4a6e38}"/>
|
||||
<!-- Windows 8.1 and Windows Server 2012 R2 -->
|
||||
<supportedOS Id="{1f676c76-80e1-4239-95bb-83d0f6d0da78}"/>
|
||||
<!-- Windows 10 -->
|
||||
<supportedOS Id="{8e0f7a12-bfb3-4fe8-b9a5-48fd50a15a9a}"/>
|
||||
</application>
|
||||
</compatibility>
|
||||
<application xmlns="urn:schemas-microsoft-com:asm.v3">
|
||||
<windowsSettings>
|
||||
<dpiAware xmlns="http://schemas.microsoft.com/SMI/2005/WindowsSettings">True/PM</dpiAware>
|
||||
<dpiAwareness xmlns="http://schemas.microsoft.com/SMI/2016/WindowsSettings">PerMonitorV2, PerMonitor</dpiAwareness>
|
||||
</windowsSettings>
|
||||
</application>
|
||||
</assembly>
|
After Width: | Height: | Size: 133 KiB |
|
@ -0,0 +1,44 @@
|
|||
#include <windows.h>
|
||||
|
||||
IDI_ICON1 ICON "QQPlayer.ico"
|
||||
|
||||
// CREATEPROCESS_MANIFEST_RESOURCE_ID RT_MANIFEST "QQPlayer.exe.manifest"
|
||||
|
||||
VS_VERSION_INFO VERSIONINFO
|
||||
FILEVERSION 1,0,0,0
|
||||
PRODUCTVERSION 1,0,0,0
|
||||
FILEFLAGSMASK 0x3fL
|
||||
#ifdef _DEBUG
|
||||
FILEFLAGS VS_FF_DEBUG
|
||||
#else
|
||||
FILEFLAGS 0x0L
|
||||
#endif
|
||||
FILEOS VOS_NT_WINDOWS32
|
||||
FILETYPE VFT_APP
|
||||
FILESUBTYPE VFT2_UNKNOWN
|
||||
BEGIN
|
||||
BLOCK "StringFileInfo"
|
||||
BEGIN
|
||||
BLOCK "040904b0"
|
||||
BEGIN
|
||||
VALUE "Comments", "Built by the Qt Toolkit."
|
||||
VALUE "CompanyName", "wangwenx190"
|
||||
VALUE "FileDescription", "QQPlayer DEMO"
|
||||
VALUE "FileVersion", "1.0.0.0"
|
||||
VALUE "InternalName", "qqplayer-demo"
|
||||
VALUE "LegalCopyright", "MIT License"
|
||||
#ifdef _DEBUG
|
||||
VALUE "OriginalFilename", "QQPlayerd.exe"
|
||||
#else
|
||||
VALUE "OriginalFilename", "QQPlayer.exe"
|
||||
#endif
|
||||
VALUE "ProductName", "QQPlayer"
|
||||
VALUE "ProductVersion", "1.0.0.0"
|
||||
VALUE "LegalTrademarks", "Tencent"
|
||||
END
|
||||
END
|
||||
BLOCK "VarFileInfo"
|
||||
BEGIN
|
||||
VALUE "Translation", 0x409, 1200
|
||||
END
|
||||
END
|
|
@ -0,0 +1,12 @@
|
|||
Qt Quick 模仿的 QQ播放器
|
||||
|
||||
只做了主界面,而且只有界面,没有功能,仅供展示
|
||||
|
||||
可以看出,只要有贴图,Qt Quick 做这种界面很容易的
|
||||
|
||||
按钮的图片有些糊,而且边缘呈锯齿状,是因为我是直接从截图里扣下来的
|
||||
,没有仔细处理。由于只是示例项目,因此不会再进行任何额外处理了。
|
||||
如果是公司的项目,肯定会有正规的高清贴图的。
|
||||
|
||||
所有来自QQ播放器的图片以及图标,版权均归腾讯所有。
|
||||
此仓库里提供的所有相关的素材文件,仅供学习交流,请勿传播甚至商用。
|
|
@ -0,0 +1,28 @@
|
|||
<RCC>
|
||||
<qresource prefix="/images">
|
||||
<file alias="background.png">resources/images/background.png</file>
|
||||
<file alias="button_close_black.svg">../../resources/images/button_close_black.svg</file>
|
||||
<file alias="button_close_white.svg">../../resources/images/button_close_white.svg</file>
|
||||
<file alias="button_maximize_black.svg">../../resources/images/button_maximize_black.svg</file>
|
||||
<file alias="button_maximize_white.svg">../../resources/images/button_maximize_white.svg</file>
|
||||
<file alias="button_minimize_black.svg">../../resources/images/button_minimize_black.svg</file>
|
||||
<file alias="button_minimize_white.svg">../../resources/images/button_minimize_white.svg</file>
|
||||
<file alias="button_restore_black.svg">../../resources/images/button_restore_black.svg</file>
|
||||
<file alias="button_restore_white.svg">../../resources/images/button_restore_white.svg</file>
|
||||
<file alias="logo.png">resources/images/logo.png</file>
|
||||
<file alias="open_file_blue.png">resources/images/open_file_blue.png</file>
|
||||
<file alias="open_file_white.png">resources/images/open_file_white.png</file>
|
||||
<file alias="main_menu_blue.png">resources/images/main_menu_blue.png</file>
|
||||
<file alias="main_menu_white.png">resources/images/main_menu_white.png</file>
|
||||
<file alias="play_blue.png">resources/images/play_blue.png</file>
|
||||
<file alias="play_blue_light.png">resources/images/play_blue_light.png</file>
|
||||
<file alias="stop_blue.png">resources/images/stop_blue.png</file>
|
||||
<file alias="stop_blue_light.png">resources/images/stop_blue_light.png</file>
|
||||
<file alias="previous_blue.png">resources/images/previous_blue.png</file>
|
||||
<file alias="previous_blue_light.png">resources/images/previous_blue_light.png</file>
|
||||
<file alias="next_blue.png">resources/images/next_blue.png</file>
|
||||
<file alias="next_blue_light.png">resources/images/next_blue_light.png</file>
|
||||
<file alias="volume_blue.png">resources/images/volume_blue.png</file>
|
||||
<file alias="volume_blue_light.png">resources/images/volume_blue_light.png</file>
|
||||
</qresource>
|
||||
</RCC>
|
|
@ -0,0 +1,48 @@
|
|||
#include "../../framelessquickhelper.h"
|
||||
#include <QGuiApplication>
|
||||
#include <QQmlApplicationEngine>
|
||||
|
||||
int main(int argc, char *argv[]) {
|
||||
qputenv("QSG_RHI", "1");
|
||||
qputenv("QSG_INFO", "1");
|
||||
qputenv("QSG_RHI_BACKEND", "opengl");
|
||||
#if (QT_VERSION <= QT_VERSION_CHECK(6, 0, 0))
|
||||
QGuiApplication::setAttribute(
|
||||
Qt::ApplicationAttribute::AA_EnableHighDpiScaling);
|
||||
QGuiApplication::setAttribute(
|
||||
Qt::ApplicationAttribute::AA_UseHighDpiPixmaps);
|
||||
#endif
|
||||
#if (QT_VERSION >= QT_VERSION_CHECK(5, 14, 0))
|
||||
QGuiApplication::setHighDpiScaleFactorRoundingPolicy(
|
||||
Qt::HighDpiScaleFactorRoundingPolicy::PassThrough);
|
||||
#endif
|
||||
QGuiApplication::setApplicationName(QString::fromUtf8("QQPlayer"));
|
||||
QGuiApplication::setApplicationDisplayName(QString::fromUtf8("QQPlayer"));
|
||||
#ifndef Q_OS_WINDOWS
|
||||
QGuiApplication::setApplicationVersion(QString::fromUtf8("1.0.0"));
|
||||
#endif
|
||||
QGuiApplication::setOrganizationName(QString::fromUtf8("wangwenx190"));
|
||||
QGuiApplication::setOrganizationDomain(
|
||||
QString::fromUtf8("wangwenx190.github.io"));
|
||||
QGuiApplication application(argc, argv);
|
||||
QQmlApplicationEngine engine;
|
||||
qmlRegisterType<FramelessQuickHelper>("wangwenx190.Utils", 1, 0,
|
||||
"FramelessHelper");
|
||||
const QUrl mainQmlUrl(QString::fromUtf8("qrc:///qml/main.qml"));
|
||||
const QMetaObject::Connection connection = QObject::connect(
|
||||
&engine, &QQmlApplicationEngine::objectCreated, &application,
|
||||
[&mainQmlUrl, &connection](QObject *object, const QUrl &url) {
|
||||
if (url != mainQmlUrl) {
|
||||
return;
|
||||
}
|
||||
if (!object) {
|
||||
QGuiApplication::exit(-1);
|
||||
} else {
|
||||
QObject::disconnect(connection);
|
||||
}
|
||||
},
|
||||
Qt::QueuedConnection);
|
||||
engine.load(mainQmlUrl);
|
||||
|
||||
return QGuiApplication::exec();
|
||||
}
|
|
@ -0,0 +1,15 @@
|
|||
<RCC>
|
||||
<qresource prefix="/qml">
|
||||
<file alias="main.qml">resources/qml/main.qml</file>
|
||||
<file alias="CloseButton.qml">resources/qml/CloseButton.qml</file>
|
||||
<file alias="MaximizeButton.qml">resources/qml/MaximizeButton.qml</file>
|
||||
<file alias="MinimizeButton.qml">resources/qml/MinimizeButton.qml</file>
|
||||
<file alias="OpenFileButton.qml">resources/qml/OpenFileButton.qml</file>
|
||||
<file alias="MainMenuButton.qml">resources/qml/MainMenuButton.qml</file>
|
||||
<file alias="PlayButton.qml">resources/qml/PlayButton.qml</file>
|
||||
<file alias="StopButton.qml">resources/qml/StopButton.qml</file>
|
||||
<file alias="PreviousButton.qml">resources/qml/PreviousButton.qml</file>
|
||||
<file alias="NextButton.qml">resources/qml/NextButton.qml</file>
|
||||
<file alias="VolumeButton.qml">resources/qml/VolumeButton.qml</file>
|
||||
</qresource>
|
||||
</RCC>
|
After Width: | Height: | Size: 130 KiB |
After Width: | Height: | Size: 14 KiB |
After Width: | Height: | Size: 2.0 KiB |
After Width: | Height: | Size: 2.6 KiB |
After Width: | Height: | Size: 1.8 KiB |
After Width: | Height: | Size: 1.8 KiB |
After Width: | Height: | Size: 4.0 KiB |
After Width: | Height: | Size: 4.4 KiB |
After Width: | Height: | Size: 2.6 KiB |
After Width: | Height: | Size: 2.5 KiB |
After Width: | Height: | Size: 1.7 KiB |
After Width: | Height: | Size: 1.7 KiB |
After Width: | Height: | Size: 1.6 KiB |
After Width: | Height: | Size: 1.6 KiB |
After Width: | Height: | Size: 1.8 KiB |
After Width: | Height: | Size: 1.7 KiB |
|
@ -0,0 +1,23 @@
|
|||
import QtQuick 2.15
|
||||
import QtQuick.Controls 2.15
|
||||
|
||||
Button {
|
||||
id: button
|
||||
|
||||
width: 45
|
||||
height: 30
|
||||
|
||||
ToolTip.visible: hovered && !down
|
||||
ToolTip.delay: Qt.styleHints.mousePressAndHoldInterval
|
||||
ToolTip.text: qsTr("Close")
|
||||
|
||||
contentItem: Image {
|
||||
anchors.fill: parent
|
||||
source: "qrc:/images/button_close_white.svg"
|
||||
}
|
||||
|
||||
background: Rectangle {
|
||||
visible: button.down || button.hovered
|
||||
color: button.down ? "#8c0a15" : (button.hovered ? "#e81123" : "transparent")
|
||||
}
|
||||
}
|
|
@ -0,0 +1,17 @@
|
|||
import QtQuick 2.15
|
||||
import QtQuick.Controls 2.15
|
||||
|
||||
Button {
|
||||
id: button
|
||||
|
||||
width: 75
|
||||
height: 15
|
||||
|
||||
contentItem: Image {
|
||||
anchors.fill: parent
|
||||
source: button.down
|
||||
|| button.hovered ? "qrc:/images/main_menu_blue.png" : "qrc:/images/main_menu_white.png"
|
||||
}
|
||||
|
||||
background: Item {}
|
||||
}
|
|
@ -0,0 +1,25 @@
|
|||
import QtQuick 2.15
|
||||
import QtQuick.Controls 2.15
|
||||
|
||||
Button {
|
||||
id: button
|
||||
|
||||
width: 45
|
||||
height: 30
|
||||
|
||||
property bool maximized: false
|
||||
|
||||
ToolTip.visible: hovered && !down
|
||||
ToolTip.delay: Qt.styleHints.mousePressAndHoldInterval
|
||||
ToolTip.text: maximized ? qsTr("Restore") : qsTr("Maximize")
|
||||
|
||||
contentItem: Image {
|
||||
anchors.fill: parent
|
||||
source: maximized ? "qrc:/images/button_restore_white.svg" : "qrc:/images/button_maximize_white.svg"
|
||||
}
|
||||
|
||||
background: Rectangle {
|
||||
visible: button.down || button.hovered
|
||||
color: button.down ? "#808080" : (button.hovered ? "#c7c7c7" : "transparent")
|
||||
}
|
||||
}
|
|
@ -0,0 +1,23 @@
|
|||
import QtQuick 2.15
|
||||
import QtQuick.Controls 2.15
|
||||
|
||||
Button {
|
||||
id: button
|
||||
|
||||
width: 45
|
||||
height: 30
|
||||
|
||||
ToolTip.visible: hovered && !down
|
||||
ToolTip.delay: Qt.styleHints.mousePressAndHoldInterval
|
||||
ToolTip.text: qsTr("Minimize")
|
||||
|
||||
contentItem: Image {
|
||||
anchors.fill: parent
|
||||
source: "qrc:/images/button_minimize_white.svg"
|
||||
}
|
||||
|
||||
background: Rectangle {
|
||||
visible: button.down || button.hovered
|
||||
color: button.down ? "#808080" : (button.hovered ? "#c7c7c7" : "transparent")
|
||||
}
|
||||
}
|
|
@ -0,0 +1,17 @@
|
|||
import QtQuick 2.15
|
||||
import QtQuick.Controls 2.15
|
||||
|
||||
Button {
|
||||
id: button
|
||||
|
||||
width: 16
|
||||
height: 14
|
||||
|
||||
contentItem: Image {
|
||||
anchors.fill: parent
|
||||
source: button.down
|
||||
|| button.hovered ? "qrc:/images/next_blue_light.png" : "qrc:/images/next_blue.png"
|
||||
}
|
||||
|
||||
background: Item {}
|
||||
}
|
|
@ -0,0 +1,17 @@
|
|||
import QtQuick 2.15
|
||||
import QtQuick.Controls 2.15
|
||||
|
||||
Button {
|
||||
id: button
|
||||
|
||||
width: 187
|
||||
height: 50
|
||||
|
||||
contentItem: Image {
|
||||
anchors.fill: parent
|
||||
source: button.down
|
||||
|| button.hovered ? "qrc:/images/open_file_blue.png" : "qrc:/images/open_file_white.png"
|
||||
}
|
||||
|
||||
background: Item {}
|
||||
}
|
|
@ -0,0 +1,17 @@
|
|||
import QtQuick 2.15
|
||||
import QtQuick.Controls 2.15
|
||||
|
||||
Button {
|
||||
id: button
|
||||
|
||||
width: 45
|
||||
height: 45
|
||||
|
||||
contentItem: Image {
|
||||
anchors.fill: parent
|
||||
source: button.down
|
||||
|| button.hovered ? "qrc:/images/play_blue_light.png" : "qrc:/images/play_blue.png"
|
||||
}
|
||||
|
||||
background: Item {}
|
||||
}
|
|
@ -0,0 +1,17 @@
|
|||
import QtQuick 2.15
|
||||
import QtQuick.Controls 2.15
|
||||
|
||||
Button {
|
||||
id: button
|
||||
|
||||
width: 16
|
||||
height: 14
|
||||
|
||||
contentItem: Image {
|
||||
anchors.fill: parent
|
||||
source: button.down
|
||||
|| button.hovered ? "qrc:/images/previous_blue_light.png" : "qrc:/images/previous_blue.png"
|
||||
}
|
||||
|
||||
background: Item {}
|
||||
}
|
|
@ -0,0 +1,17 @@
|
|||
import QtQuick 2.15
|
||||
import QtQuick.Controls 2.15
|
||||
|
||||
Button {
|
||||
id: button
|
||||
|
||||
width: 14
|
||||
height: 14
|
||||
|
||||
contentItem: Image {
|
||||
anchors.fill: parent
|
||||
source: button.down
|
||||
|| button.hovered ? "qrc:/images/stop_blue_light.png" : "qrc:/images/stop_blue.png"
|
||||
}
|
||||
|
||||
background: Item {}
|
||||
}
|
|
@ -0,0 +1,17 @@
|
|||
import QtQuick 2.15
|
||||
import QtQuick.Controls 2.15
|
||||
|
||||
Button {
|
||||
id: button
|
||||
|
||||
width: 18
|
||||
height: 14
|
||||
|
||||
contentItem: Image {
|
||||
anchors.fill: parent
|
||||
source: button.down
|
||||
|| button.hovered ? "qrc:/images/volume_blue_light.png" : "qrc:/images/volume_blue.png"
|
||||
}
|
||||
|
||||
background: Item {}
|
||||
}
|
|
@ -0,0 +1,134 @@
|
|||
import QtQuick 2.15
|
||||
import QtQuick.Window 2.15
|
||||
import wangwenx190.Utils 1.0
|
||||
|
||||
Window {
|
||||
id: window
|
||||
visible: true
|
||||
width: 800
|
||||
height: 540
|
||||
title: qsTr("QQ Player")
|
||||
|
||||
FramelessHelper {
|
||||
id: framelessHelper
|
||||
}
|
||||
|
||||
Rectangle {
|
||||
id: titleBar
|
||||
height: framelessHelper.titleBarHeight
|
||||
color: "#111111"
|
||||
anchors.top: parent.top
|
||||
anchors.left: parent.left
|
||||
anchors.right: parent.right
|
||||
|
||||
MainMenuButton {
|
||||
id: mainMenuButton
|
||||
anchors.left: parent.left
|
||||
anchors.leftMargin: 15
|
||||
anchors.verticalCenter: parent.verticalCenter
|
||||
Component.onCompleted: framelessHelper.addIgnoreObject(
|
||||
mainMenuButton)
|
||||
}
|
||||
|
||||
Row {
|
||||
anchors.top: parent.top
|
||||
anchors.right: parent.right
|
||||
|
||||
MinimizeButton {
|
||||
id: minimizeButton
|
||||
onClicked: window.showMinimized()
|
||||
Component.onCompleted: framelessHelper.addIgnoreObject(
|
||||
minimizeButton)
|
||||
}
|
||||
|
||||
MaximizeButton {
|
||||
id: maximizeButton
|
||||
maximized: window.visibility === Window.Maximized
|
||||
onClicked: {
|
||||
if (maximized) {
|
||||
window.showNormal()
|
||||
} else {
|
||||
window.showMaximized()
|
||||
}
|
||||
}
|
||||
Component.onCompleted: framelessHelper.addIgnoreObject(
|
||||
maximizeButton)
|
||||
}
|
||||
|
||||
CloseButton {
|
||||
id: closeButton
|
||||
onClicked: window.close()
|
||||
Component.onCompleted: framelessHelper.addIgnoreObject(
|
||||
closeButton)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Image {
|
||||
id: backgroundImage
|
||||
anchors.top: titleBar.bottom
|
||||
anchors.bottom: controlPanel.top
|
||||
anchors.left: parent.left
|
||||
anchors.right: parent.right
|
||||
source: "qrc:/images/background.png"
|
||||
|
||||
Image {
|
||||
id: logoImage
|
||||
width: 123
|
||||
height: 99
|
||||
anchors.centerIn: parent
|
||||
source: "qrc:/images/logo.png"
|
||||
}
|
||||
|
||||
OpenFileButton {
|
||||
id: openFileButton
|
||||
anchors.top: logoImage.bottom
|
||||
anchors.topMargin: 25
|
||||
anchors.horizontalCenter: parent.horizontalCenter
|
||||
}
|
||||
}
|
||||
|
||||
Rectangle {
|
||||
id: controlPanel
|
||||
height: 63
|
||||
anchors.bottom: parent.bottom
|
||||
anchors.left: parent.left
|
||||
anchors.right: parent.right
|
||||
color: "#111111"
|
||||
|
||||
StopButton {
|
||||
id: stopButton
|
||||
anchors.right: previousButton.left
|
||||
anchors.rightMargin: 30
|
||||
anchors.verticalCenter: parent.verticalCenter
|
||||
}
|
||||
|
||||
PreviousButton {
|
||||
id: previousButton
|
||||
anchors.right: playButton.left
|
||||
anchors.rightMargin: 30
|
||||
anchors.verticalCenter: parent.verticalCenter
|
||||
}
|
||||
|
||||
PlayButton {
|
||||
id: playButton
|
||||
anchors.centerIn: parent
|
||||
}
|
||||
|
||||
NextButton {
|
||||
id: nextButton
|
||||
anchors.left: playButton.right
|
||||
anchors.leftMargin: 30
|
||||
anchors.verticalCenter: parent.verticalCenter
|
||||
}
|
||||
|
||||
VolumeButton {
|
||||
id: volumeButton
|
||||
anchors.left: nextButton.right
|
||||
anchors.leftMargin: 30
|
||||
anchors.verticalCenter: parent.verticalCenter
|
||||
}
|
||||
}
|
||||
|
||||
Component.onCompleted: framelessHelper.removeWindowFrame()
|
||||
}
|
After Width: | Height: | Size: 180 KiB |