我注意到,当我选择“材质样式”,然后在模型中创建包含许多元素的组合框时,第二次单击时它会向下滑动弹出窗口。问题是我无法选择组合框中的最后一个元素。在创建对话框/弹出窗口时,我已经遇到过这种问题(向下滑动弹出窗口并稍微向右滑动),但后来我使用“parent: Overlay.overlay”并设置 x,y 坐标,一切正常。这次我不知道如何修复它。
截图:
第一次单击组合框:
第二次单击组合框:
这是我的代码:
main.qml
import QtQuick 2.15
import QtQuick.Window 2.15
import QtQuick.Controls 2.15
Window {
id: window
width: 640
height: 480
visible: true
title: qsTr("Hello World")
ComboBox {
id: comboBox
anchors.verticalCenter: parent.verticalCenter
anchors.horizontalCenter: parent.horizontalCenter
model: [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20]
}
}
main.py:
import sys
import os
from PySide2.QtGui import QGuiApplication
from PySide2.QtQml import QQmlApplicationEngine
if __name__ == "__main__":
app = QGuiApplication(sys.argv)
os.environ["QT_QUICK_CONTROLS_STYLE"] = "Material"
engine = QQmlApplicationEngine()
engine.load(os.path.join(os.path.dirname(__file__), "main.qml"))
if not engine.rootObjects():
sys.exit(-1)
sys.exit(app.exec_())
问题在我的系统上重现(在使用 Intel CPU 的 Ubuntu 20.04 上),因此它似乎确实是一个错误。
我可以通过自定义 ControlBox 的弹出窗口来解决此问题(请参阅自定义组合框)。 这是我的 main.qml:
import QtQuick 2.15
import QtQuick.Controls 2.15
import QtQuick.Controls.Material 2.15
ApplicationWindow {
id: window
width: 640
height: 480
visible: true
title: qsTr("Hello World")
ComboBox {
anchors.centerIn: parent
id: control
model: 20
popup: Popup {
y: control.height/2-implicitHeight/2
width: control.width
implicitHeight: contentItem.implicitHeight < (ApplicationWindow.window.height * 0.9)? contentItem.implicitHeight : ApplicationWindow.window.height * 0.9
padding: 0
Material.elevation: 3
contentItem: ListView {
clip: true
implicitHeight: contentHeight
model: control.popup.visible ? control.delegateModel : null
currentIndex: control.highlightedIndex
}
}
}
}
我使用了“默认”qtquickcontrols2.conf 文件:
[Controls]
Style=Material
[Universal]
Theme=System
Accent=Red
[Material]
Theme=Light
Accent=Teal
Primary=BlueGrey
您可能需要稍微修改一下,才能按照您想要的方式获得自定义弹出窗口的外观和感觉(正如我不得不做的那样),以便获得与 ControBox 在设置时的默认行为类似的行为,或者您想要的行为行为(我使用了 y、implicitHeight、padding 和 Material.elevation,但保留了 Material 的属性,除了海拔)。
您可能注意到我用 ApplicationWindow 替换了 Window,因为这是我所熟悉的并提供对 ApplicationWindow 覆盖层的访问。
我希望这个解决方法也适用于您的设置。
这是一个错误,我找到原因了。
enter : Transition
{
// grow_fade_in
//NumberAnimation { property : "scale"; from : 0.9; to : 1.0; easing.type : Easing.OutQuint; duration : 220 }
NumberAnimation { property : "opacity"; from : 0.0; to : 1.0; easing.type : Easing.OutCubic; duration : 150 }
}
exit : Transition
{
// shrink_fade_out
//NumberAnimation { property : "scale"; from : 1.0; to : 0.9; easing.type : Easing.OutQuint; duration : 220 }
NumberAnimation { property : "opacity"; from : 1.0; to : 0.0; easing.type : Easing.OutCubic; duration : 150 }
}
如果您像我一样注释掉每个转换的第一个 NumberAnimation,您将不再遇到该问题。 缩放属性导致它。我尝试通过更改数字来修复它,但没有找到保留缩放属性的修复方法,但您仍然拥有不透明度属性。