|
|
|
|
/******************************************************************
|
|
|
|
|
Copyright © Deng Zhimao Co., Ltd. 1990-2030. All rights reserved.
|
|
|
|
|
* @projectName radio
|
|
|
|
|
* @brief Radio.qml
|
|
|
|
|
* @author Deng Zhimao
|
|
|
|
|
* @email 1252699831@qq.com
|
|
|
|
|
* @date 2020-08-19
|
|
|
|
|
*******************************************************************/
|
|
|
|
|
import QtQuick 2.9
|
|
|
|
|
import QtQuick.Window 2.2
|
|
|
|
|
import QtQuick.Controls 2.5
|
|
|
|
|
import QtQuick.Controls 1.3
|
|
|
|
|
import QtQuick.Controls.Styles 1.4
|
|
|
|
|
import radio 1.0
|
|
|
|
|
import "../helpbutton"
|
|
|
|
|
Item {
|
|
|
|
|
id: myRadio
|
|
|
|
|
visible: false
|
|
|
|
|
property real iconsOpacity: 1.0
|
|
|
|
|
property bool muteFlag: true
|
|
|
|
|
|
|
|
|
|
HelpMessages {
|
|
|
|
|
anchors.fill: parent
|
|
|
|
|
z: 105
|
|
|
|
|
appIcon: WINStyle ? "" : "qrc:/desktop/androidstyleicons/radio.png"
|
|
|
|
|
appName: "收音机FM"
|
|
|
|
|
appVersion: "Version 1.0.1"
|
|
|
|
|
subtoolText: "1.此软件为收音机App,需要额外购买tea5767收音机模块,可在淘宝自行搜索购买,接开发板5V电源和GND,SDA和SDL分别接正点原子MP157的拓展IO PZ5和PZ4处。
|
|
|
|
|
2.请将收音机模块至于室外空旷之处才能收音!程序仅供学习与参考!"
|
|
|
|
|
versionText: "1.【Version 1.0.0 2020-10-15】。\n初始版本\n2.【Version 1.0.1 2020-12-09】。\n兼容480x272分辨率"
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
onVisibleChanged: {
|
|
|
|
|
formState.state == 'right' ? formState.state = '' : formState.state = 'right'
|
|
|
|
|
}
|
|
|
|
|
Component.onCompleted: {
|
|
|
|
|
myRadio.x = parent.width
|
|
|
|
|
}
|
|
|
|
|
Item {
|
|
|
|
|
id: formState
|
|
|
|
|
states: State {
|
|
|
|
|
name: "right"
|
|
|
|
|
PropertyChanges {
|
|
|
|
|
target: myRadio
|
|
|
|
|
x: 0
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
transitions: Transition {
|
|
|
|
|
NumberAnimation {
|
|
|
|
|
property: "x"
|
|
|
|
|
easing.type: Easing.InOutQuart
|
|
|
|
|
duration: 500
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
MyRadio {
|
|
|
|
|
id: radio
|
|
|
|
|
onLevelChanged: {
|
|
|
|
|
levelText.text = "信号等级为: " + readLevel
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
Flickable {
|
|
|
|
|
anchors.fill: parent
|
|
|
|
|
interactive: smallScreen ? true : false
|
|
|
|
|
contentWidth: smallScreen ? parent.width + 320 : parent.width
|
|
|
|
|
contentHeight: smallScreen ? parent.height + 208 : parent.height
|
|
|
|
|
|
|
|
|
|
ScrollBar.vertical: ScrollBar {
|
|
|
|
|
visible: smallScreen ? true : false
|
|
|
|
|
id: scrollBarVertical1
|
|
|
|
|
z: 20
|
|
|
|
|
width: 5
|
|
|
|
|
hoverEnabled: true
|
|
|
|
|
background: Rectangle {color: "#33bbbbbb"}
|
|
|
|
|
onActiveChanged: {
|
|
|
|
|
active = true;
|
|
|
|
|
}
|
|
|
|
|
Component.onCompleted: {
|
|
|
|
|
scrollBarVertical1.active = true;
|
|
|
|
|
}
|
|
|
|
|
contentItem: Rectangle{
|
|
|
|
|
implicitWidth: 5
|
|
|
|
|
implicitHeight: 100
|
|
|
|
|
radius: 2
|
|
|
|
|
color: scrollBarVertical1.hovered ? "#25cfea" : "#88bbbbbb"
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
ScrollBar.horizontal: ScrollBar {
|
|
|
|
|
visible: smallScreen ? true : false
|
|
|
|
|
id: scrollBarHorizontal1
|
|
|
|
|
z: 20
|
|
|
|
|
height: 5
|
|
|
|
|
hoverEnabled: true
|
|
|
|
|
background: Rectangle {color: "#33bbbbbb"}
|
|
|
|
|
onActiveChanged: {
|
|
|
|
|
active = true;
|
|
|
|
|
}
|
|
|
|
|
Component.onCompleted: {
|
|
|
|
|
scrollBarHorizontal1.active = true;
|
|
|
|
|
}
|
|
|
|
|
contentItem: Rectangle{
|
|
|
|
|
implicitWidth: 100
|
|
|
|
|
implicitHeight: 5
|
|
|
|
|
radius: 2
|
|
|
|
|
color: scrollBarHorizontal1.hovered ? "#25cfea" : "#88bbbbbb"
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
Timer{
|
|
|
|
|
id: timer
|
|
|
|
|
interval: 100
|
|
|
|
|
repeat: true
|
|
|
|
|
onTriggered:{
|
|
|
|
|
if (pre_button.checked)
|
|
|
|
|
slider.value -= 0.003125
|
|
|
|
|
|
|
|
|
|
if (next_button.checked)
|
|
|
|
|
slider.value += 0.003125
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
Button {
|
|
|
|
|
id: pre_button
|
|
|
|
|
anchors.top: parent.verticalCenter
|
|
|
|
|
anchors.topMargin: 20
|
|
|
|
|
anchors.right: parent.horizontalCenter
|
|
|
|
|
anchors.rightMargin: 150
|
|
|
|
|
width: 40
|
|
|
|
|
height: 40
|
|
|
|
|
style: ButtonStyle {
|
|
|
|
|
background:Rectangle{
|
|
|
|
|
anchors.fill: parent
|
|
|
|
|
color: "transparent"
|
|
|
|
|
Image {
|
|
|
|
|
id: preView
|
|
|
|
|
source: "qrc:/radio/images/preview.png"
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
MouseArea {
|
|
|
|
|
anchors.fill: parent
|
|
|
|
|
//hoverEnabled: true
|
|
|
|
|
|
|
|
|
|
onClicked: {
|
|
|
|
|
//pre_button.opacity = 0.5
|
|
|
|
|
slider.value -= 0.003125
|
|
|
|
|
}
|
|
|
|
|
//onEntered: pre_button.opacity = 0.8
|
|
|
|
|
onPressed: pre_button.opacity = 0.8
|
|
|
|
|
onReleased: {
|
|
|
|
|
pre_button.opacity = 1
|
|
|
|
|
pre_button.checked = false
|
|
|
|
|
timer.stop()
|
|
|
|
|
}
|
|
|
|
|
//onExited: pre_button.opacity = 1
|
|
|
|
|
onPressAndHold: {
|
|
|
|
|
pre_button.checked = true
|
|
|
|
|
timer.start()
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
Button {
|
|
|
|
|
id: next_button
|
|
|
|
|
anchors.top: parent.verticalCenter
|
|
|
|
|
anchors.topMargin: 20
|
|
|
|
|
anchors.left: parent.horizontalCenter
|
|
|
|
|
anchors.leftMargin: 150
|
|
|
|
|
width: 40
|
|
|
|
|
height: 40
|
|
|
|
|
checkable: true
|
|
|
|
|
style: ButtonStyle {
|
|
|
|
|
background:Rectangle{
|
|
|
|
|
anchors.fill: parent
|
|
|
|
|
color: "transparent"
|
|
|
|
|
Image {
|
|
|
|
|
id: next
|
|
|
|
|
source: "qrc:/radio/images/next.png"
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
MouseArea {
|
|
|
|
|
anchors.fill: parent
|
|
|
|
|
//hoverEnabled: true
|
|
|
|
|
onClicked: {
|
|
|
|
|
//next_button.opacity = 0.5
|
|
|
|
|
slider.value += 0.003125
|
|
|
|
|
}
|
|
|
|
|
//onEntered: next_button.opacity = 0.8
|
|
|
|
|
onPressed: next_button.opacity = 0.8
|
|
|
|
|
onReleased: {
|
|
|
|
|
next_button.opacity = 1
|
|
|
|
|
next_button.checked = false
|
|
|
|
|
timer.stop()
|
|
|
|
|
}
|
|
|
|
|
//onExited: next_button.opacity = 1
|
|
|
|
|
onPressAndHold: {
|
|
|
|
|
next_button.checked = true
|
|
|
|
|
timer.start()
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
Text {
|
|
|
|
|
id: levelText
|
|
|
|
|
text: qsTr("信号等级为: 0")
|
|
|
|
|
anchors.top: parent.verticalCenter
|
|
|
|
|
anchors.horizontalCenter: parent.horizontalCenter
|
|
|
|
|
anchors.topMargin: 20
|
|
|
|
|
font.bold: true
|
|
|
|
|
font.pixelSize: 20
|
|
|
|
|
color: "white"
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
Text {
|
|
|
|
|
id: fm
|
|
|
|
|
text: qsTr("FM")
|
|
|
|
|
color: "white"
|
|
|
|
|
anchors.right: fmValue.left
|
|
|
|
|
anchors.rightMargin: 30
|
|
|
|
|
anchors.bottom: parent.verticalCenter
|
|
|
|
|
anchors.bottomMargin: 20
|
|
|
|
|
font.pixelSize: 30
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
Text {
|
|
|
|
|
id: fmUnit
|
|
|
|
|
text: qsTr("MHz")
|
|
|
|
|
color: "white"
|
|
|
|
|
anchors.left: fmValue.right
|
|
|
|
|
anchors.leftMargin: 30
|
|
|
|
|
anchors.bottom: parent.verticalCenter
|
|
|
|
|
anchors.bottomMargin: 20
|
|
|
|
|
font.pixelSize: 30
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
Text {
|
|
|
|
|
id: mute
|
|
|
|
|
text: !muteFlag ? "Mute" : "UnMute"
|
|
|
|
|
color: "white"
|
|
|
|
|
anchors.left: next_button.right
|
|
|
|
|
anchors.leftMargin: 50
|
|
|
|
|
anchors.bottom: parent.verticalCenter
|
|
|
|
|
anchors.bottomMargin: 20
|
|
|
|
|
font.pixelSize: 30
|
|
|
|
|
MouseArea {
|
|
|
|
|
anchors.fill: parent
|
|
|
|
|
onClicked: {
|
|
|
|
|
muteFlag = !muteFlag;
|
|
|
|
|
radio.setMuteFlag(muteFlag)
|
|
|
|
|
radio.setFrequency(fmValue.text)
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
Text {
|
|
|
|
|
id: fmValue
|
|
|
|
|
color: "white"
|
|
|
|
|
anchors.horizontalCenter : parent.horizontalCenter
|
|
|
|
|
anchors.bottom: parent.verticalCenter
|
|
|
|
|
anchors.bottomMargin: 20
|
|
|
|
|
font.pixelSize: 100
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
Image {
|
|
|
|
|
id: slidebg
|
|
|
|
|
source: "qrc:/radio/images/sliderbg.png"
|
|
|
|
|
anchors.horizontalCenter : parent.horizontalCenter
|
|
|
|
|
anchors.bottom: parent.verticalCenter
|
|
|
|
|
anchors.bottomMargin: 120
|
|
|
|
|
width: 800
|
|
|
|
|
height: 68
|
|
|
|
|
}
|
|
|
|
|
Slider {
|
|
|
|
|
id: slider
|
|
|
|
|
anchors.horizontalCenter : parent.horizontalCenter
|
|
|
|
|
anchors.bottom: parent.verticalCenter
|
|
|
|
|
anchors.bottomMargin: 120
|
|
|
|
|
width: 800
|
|
|
|
|
height: 68
|
|
|
|
|
value: 0.553125
|
|
|
|
|
stepSize: 0.003125
|
|
|
|
|
onValueChanged: {
|
|
|
|
|
fmValue.text = String(slider.value*32+76).indexOf(".") != -1
|
|
|
|
|
? String(slider.value*32+76).slice(0,5)
|
|
|
|
|
: String(slider.value*32+76).slice(0,5) + ".0"
|
|
|
|
|
radio.setMuteFlag(muteFlag)
|
|
|
|
|
radio.setFrequency(fmValue.text)
|
|
|
|
|
//console.log(fmValue.text)
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
style:SliderStyle{
|
|
|
|
|
groove:Rectangle{
|
|
|
|
|
color: "transparent"
|
|
|
|
|
}
|
|
|
|
|
handle: Rectangle{
|
|
|
|
|
anchors.centerIn: parent
|
|
|
|
|
|
|
|
|
|
Image {
|
|
|
|
|
id: handleImage
|
|
|
|
|
source: "qrc:/radio/images/handle.png"
|
|
|
|
|
anchors.centerIn: parent
|
|
|
|
|
opacity: control.pressed ? 0.8 : 1
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
width: 80
|
|
|
|
|
height: 80
|
|
|
|
|
color: "transparent"
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
ListModel {
|
|
|
|
|
id: fmModel
|
|
|
|
|
ListElement {name: ""}
|
|
|
|
|
ListElement {name: ""}
|
|
|
|
|
ListElement {name: ""}
|
|
|
|
|
ListElement {name: ""}
|
|
|
|
|
ListElement {name: ""}
|
|
|
|
|
ListElement {name: ""}
|
|
|
|
|
function getIcon(index, id) {
|
|
|
|
|
var data = [
|
|
|
|
|
["qrc:/radio/images/button.png"],
|
|
|
|
|
["qrc:/radio/images/button.png"],
|
|
|
|
|
["qrc:/radio/images/button.png"],
|
|
|
|
|
["qrc:/radio/images/button.png"],
|
|
|
|
|
["qrc:/radio/images/button.png"],
|
|
|
|
|
["qrc:/radio/images/button.png"],
|
|
|
|
|
]
|
|
|
|
|
return data[index][0];
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
function getAppName(index, id) {
|
|
|
|
|
var data = [
|
|
|
|
|
["93.6MHz"],
|
|
|
|
|
["95.4MHz"],
|
|
|
|
|
["100.5MHz"],
|
|
|
|
|
["103.6MHz"],
|
|
|
|
|
["105.6MHz"],
|
|
|
|
|
["107.7MHz"],
|
|
|
|
|
]
|
|
|
|
|
return data[index][0];
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
GridView {
|
|
|
|
|
id: fm_gridView
|
|
|
|
|
visible: true
|
|
|
|
|
anchors.top: parent.verticalCenter
|
|
|
|
|
anchors.topMargin: 80
|
|
|
|
|
anchors.left: parent.left
|
|
|
|
|
anchors.right: parent.right
|
|
|
|
|
anchors.bottom: parent.bottom
|
|
|
|
|
|
|
|
|
|
focus: true
|
|
|
|
|
interactive: false
|
|
|
|
|
cellWidth: fm_gridView.width / 3
|
|
|
|
|
cellHeight: (fm_gridView.height) / 2
|
|
|
|
|
model: fmModel
|
|
|
|
|
delegate: delegateThumbnail
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
Component {
|
|
|
|
|
id: delegateThumbnail
|
|
|
|
|
Rectangle {
|
|
|
|
|
id: rectangel
|
|
|
|
|
width: fm_gridView.width / 3
|
|
|
|
|
height: fm_gridView.cellHeight
|
|
|
|
|
color: "transparent"
|
|
|
|
|
|
|
|
|
|
Rectangle {
|
|
|
|
|
width: rectangel.width - 20
|
|
|
|
|
height: 60
|
|
|
|
|
radius: 8
|
|
|
|
|
color: "#0195de"
|
|
|
|
|
anchors.centerIn: parent
|
|
|
|
|
opacity: fm_gridView.currentIndex == index ? iconsOpacity : 1
|
|
|
|
|
Image {
|
|
|
|
|
id: browse_img
|
|
|
|
|
visible: false
|
|
|
|
|
antialiasing: true
|
|
|
|
|
source: fm_gridView.model.getIcon(index, 0)
|
|
|
|
|
anchors.fill: parent
|
|
|
|
|
fillMode: Image.Stretch
|
|
|
|
|
opacity: fm_gridView.currentIndex == index ? iconsOpacity : 1
|
|
|
|
|
}
|
|
|
|
|
Text {
|
|
|
|
|
anchors.centerIn: parent
|
|
|
|
|
id: appName
|
|
|
|
|
text: qsTr(fm_gridView.model.getAppName(index, 0))
|
|
|
|
|
color: "white"
|
|
|
|
|
font.pixelSize: 30
|
|
|
|
|
font.bold: true
|
|
|
|
|
}
|
|
|
|
|
MouseArea {
|
|
|
|
|
anchors.fill: parent
|
|
|
|
|
hoverEnabled: true
|
|
|
|
|
onClicked: {
|
|
|
|
|
fm_gridView.currentIndex = index
|
|
|
|
|
var tmp = appName.text.split("MHz")
|
|
|
|
|
slider.value = (parseFloat(tmp) - 76) * 0.03125
|
|
|
|
|
//console.log(parseFloat(tmp) + " " + slider.value)
|
|
|
|
|
}
|
|
|
|
|
onEntered: {
|
|
|
|
|
fm_gridView.currentIndex = index
|
|
|
|
|
iconsOpacity = 0.5
|
|
|
|
|
}
|
|
|
|
|
onPressed:{
|
|
|
|
|
iconsOpacity = 0.8
|
|
|
|
|
fm_gridView.currentIndex = index
|
|
|
|
|
}
|
|
|
|
|
onReleased:{
|
|
|
|
|
iconsOpacity = 1
|
|
|
|
|
}
|
|
|
|
|
onExited: iconsOpacity = 1
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|