【发布时间】:2016-11-24 11:31:30
【问题描述】:
我正在尝试在 QML 中创建一个“菜单”,每个选项中都有自定义数据
对于我的应用程序的要求,我需要显示它动态加载 QML 文件 (Qt.createComponent)。我需要的是在底部显示一些固定选项,当单击顶部时,另一个选项会出现在该顶部选项下方,该选项保持在顶部
一个简单的例子。我有这个菜单:
Option 4
Option 2
Option 1
当点击Option 4时,菜单变为
Option 4
Option 3
Option 2
Option 1
所以Option 4 向上移动并出现Option 3。
我想在我的所有菜单周围都有一个“阴影”(为此我添加了一个DropShadow 组件)。
我有这个简单的测试代码,我有一个主要的Rectangle(被阴影包围),里面有2个矩形。
Rect1 用于固定部分(Option 1,Option 2),Rect2 用于“可移动”部分(Option 3,Option 4)。
Rect2 在Rect1 (z: -1) 后面,并且位于Option 2 上方只有Option 4 可见。点击Option 4时,Rect2向上移动,所有选项都可见。
为此,我必须更新Rect2 可见高度和主窗口位置(y 值),因为主窗口高度取决于此Rect2 可见高度。
我可以正常工作,但由于 2 个变量发生了变化(“固定面板”向上和向后移动),所以它经常闪烁。
我也尝试使用 ParallelAnimation 获取 2 个值,但没有成功。
有什么想法让这个菜单动作流畅吗?
Main.qml:
import QtQuick 2.0
Rectangle
{
id: window
property variant win: undefined;
Component.onCompleted:
{
var component = Qt.createComponent("TestMenu.qml");
win = component.createObject(window, {"x": 500, "y": 500});
win.show();
}
}
TestMenu.qml:
import QtQuick 2.0
import QtQuick.Window 2.1
import QtGraphicalEffects 1.0
Window {
id: window
flags: Qt.Tool | Qt.FramelessWindowHint
height: panel.height
color: "transparent"
property int radiusShadow: 20
property int iOptionHeight: 30
Rectangle {
id: panel
anchors { centerIn: parent}
height: menu1.height + menu2.heightVisible + 2*radiusShadow
width: window.width - 2*radiusShadow
color: "transparent"
Rectangle {
id: menu1
anchors { bottom: parent.bottom; bottomMargin: radiusShadow }
width: parent.width
height: column1.children.length * iOptionHeight
Column {
id: column1
anchors.fill: parent
Rectangle {
color: "red";
Text { text: qsTr("option 2") }
height: iOptionHeight; width: parent.width
}
Rectangle {
color: "green";
Text { text: qsTr("option 1") }
height: iOptionHeight; width: parent.width
}
}
}
Rectangle {
id: menu2
property int heightVisible: iOptionHeight
anchors { top: parent.top; topMargin: radiusShadow; left: menu1.left }
width: parent.width
height: column2.children.length * iOptionHeight
z: -1
Column {
id: column2
anchors.fill: parent
Rectangle {
id: blue
property bool bOpen: false
color: "blue";
height: iOptionHeight; width: parent.width
Text { text: qsTr("option 4") }
MouseArea {
anchors.fill: parent
onClicked: {
blue.bOpen = !blue.bOpen;
panel.showHideMenu2(blue.bOpen);
}
}
}
Rectangle {
color: "pink";
Text { text: qsTr("option 3") }
height: iOptionHeight; width: parent.width
}
}
}
function showHideMenu2(bShow)
{
if (bShow)
{
window.y -= iOptionHeight
menu2.heightVisible += iOptionHeight;
}
else
{
window.y += iOptionHeight
menu2.heightVisible -= iOptionHeight;
}
}
}
DropShadow {
id: dropShadow
visible: true
anchors.fill: panel
radius: radiusShadow
samples: 24
color: "#40000000"
source: panel
}
}
【问题讨论】: